對於類的方法, python內建的@property裝飾器就是負責把乙個方法變成屬性呼叫的
class
student
(object):
@property
defscore
(self):
return self._score
@score.setter
defscore
(self, value):
ifnot isinstance(value, int):
raise valueerror('score must be an integer!')
if value < 0
or value > 100:
raise valueerror('score must between 0 ~ 100!')
self._score = value
把乙個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又建立了另乙個裝飾器@score.setter,負責把乙個setter方法變成屬性賦值,於是,我們就擁有乙個可控的屬性操作:
>>> s = student()
>>> s.score = 60
# ok,實際轉化為s.set_score(60)
>>> s.score # ok,實際轉化為s.get_score()
60>>> s.score = 9999
traceback (most recent call last):
...valueerror: score must between 0 ~ 100!
還可以定義唯讀屬性,只定義getter方法,不定義setter方法就是乙個唯讀屬性.
birth是可讀寫屬性,而age就是乙個唯讀屬性:
class
student
(object):
@property
defbirth
(self):
return self._birth
@birth.setter
defbirth
(self, value):
self._birth = value
@property
defage
(self):
return
2014 - self._birth
一般來說,要使用某個類的方法,需要先例項化乙個物件再呼叫方法。
而使用@staticmethod或@classmethod,就可以不需要例項化,直接類名.方法名()來呼叫。
這有利於組織**,把某些應該屬於某個類的函式給放到那個類裡去,同時有利於命名空間的整潔。
從它們的使用上來看
@staticmethod不需要表示自身物件的self和自身類的cls引數,就跟使用函式一樣。
@classmethod也不需要self引數,但第乙個引數需要是表示自身類的cls引數。
如果在@staticmethod中要呼叫到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
而@classmethod因為持有cls引數,可以來呼叫類的屬性,類的方法,例項化物件等,避免硬編碼。
class
a(object):
bar = 1
deffoo
(self):
print
'foo'
@staticmethod
defstatic_foo
():print
'static_foo'
print a.bar
@classmethod
defclass_foo
(cls):
print
'class_foo'
print cls.bar
cls().foo()
a.static_foo()
a.class_foo()
python常用裝飾器
定義 在 執行期間動態增加功能的方式,稱之為 裝飾器 decorator 本質上,decorator就是乙個返回函式的高階函式。import functools,time defexecute time func 定義裝飾器 functools.wraps func 把名字改回來 def args,...
python常用裝飾器函式
1 property 將方法偽裝成屬性 2 setter 修改屬性 只有當被property裝飾的方法,又實現了乙個同名方法,且被setter裝飾器 裝飾了,在被裝飾的方法賦值的時候,就觸發被setter裝飾器裝飾的方法 3 deleter 刪除屬性 class student def init s...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...