python 常用裝飾器

2021-07-29 20:39:03 字數 2036 閱讀 6161

對於類的方法, 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裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...