@python内置裝飾器含義解釋
看過了關于python裝飾器的部落格,受益很大:
https://www.cnblogs.com/cicaday/p/python-decorator.html
裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的傳回值也是一個函數對象。它經常用于有切面需求的場景,比如:插入日志、性能測試、事務處理、緩存、權限校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數功能本身無關的雷同代碼并繼續重用。
在此對内置裝飾器@property @staticmethod @classmethod查了文檔,目前python解釋器含有69個内置方法(Built-in Function),property、staticmethod、classmethod即為其中3個。
[email protected]
class property(fget=None, fset=None, fdel=None, doc=None)
傳回一個property屬性,fget/fset/fdel分别是get、set、del函數,doc為屬性建立docstring
常見用法是:
class Line(object):
def __init__(self, start=Point(0, 0), end=Point(0, 0)):
self._start = start
self._end = end
@property
def start(self):
return self._start
@start.setter
def start(self, start):
self._start = start
-
為什麼需要使用getter函數?
如果不使用,将輸出屬性所在的記憶體位置,而不是屬性的内容。簡而言之,@property相當于建立了getter函數。
-
為什麼先用@property,不需要.getter,後面使用執行個體化@start.setter?
property是内置方法(built-in function),使用@property後,其過程相當于進行了property的執行個體化,傳回了一個可調用的對象(callable object),start既是執行個體化的property也預設為getter函數。即
。property對象含有三個方法:getter、setter、deleter。後續@start.setter是對setter函數的調用。start = property(getx, setx, delx)
[email protected]
将一個函數轉換為靜态函數,傳回了一個staticmethod對象,
Can be called either on the class (such as C.f()) or on an instance (such as C().f()).既可以使用類調用(C.f()),也可以執行個體化調用(C().f())
class C:
@staticmethod
def f(arg1, arg2, ...):
......
https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner
[email protected]
将一個函數轉變為類函數
class C:
@classmethod
def f(cls, arg1, arg2, …): …