裝飾器的本質
Python裡的裝飾器是一個不太容易了解的東西,下面是一些關于Python裝飾器的概念:
- 從形式上來說是在函數調用上的裝飾
- 以@開頭,接着是裝飾器的名字和可選的參數
- 裝飾器實質上是函數
- 裝飾器的傳回值是一個包裝了的函數
裝飾器的作用
裝飾器用來裝飾函數,可以在被裝飾的函數調用前做些準備工作,在被裝飾的函數調用後做些清理工作,這樣的特征使它在AOP(Aspect Oriented Programming面向切面程式設計)方面被廣泛利用。 一般裝飾器可以用在下類場景中:
- 引入日志
- 計時,用于性能分析
- 給函數增加事務能力
舉例
def delay(func):
def wrapper(*args, **kwargs):
time.sleep(1)
ret = func(*args, **kwargs)
print("delay 1 second to call %s" % func.__name__)
return ret
return wrapper
@delay
def add(a, b):
return a + b
if __name__ == "__main__":
add(1, 2)
其中:
- add是被裝飾的函數
- delay是裝飾器
- wrapper調用被裝飾的函數,并作為包裝了的函數被傳回,注意,Python裡面函數就是對象,是以可以被直接傳回。
凡是被delay裝飾過的函數,都會自動被延遲一秒執行
代碼下載下傳
本系列文章和代碼已經作為項目歸檔到github,大家覺得有幫助就請在github上star一下,你的支援是我更新的動力。github倉庫位址:jumper2014/PyCodeComplete