天天看點

Python内置裝飾器(decorator)解釋@python内置裝飾器含義解釋

@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函數。即

    start = property(getx, setx, delx)

    。property對象含有三個方法:getter、setter、deleter。後續@start.setter是對setter函數的調用。

[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, …): …