理解python裝飾器
阿新 • • 發佈:2021-10-09
def decorator(func): def wrapper(x): print("start") func(x) print("stop") return wrapper @decorator def hi(x): print(x) hi(12345678) #a=decorator(hi) #hi=a #hi(12345678)使用裝飾器的目的不再贅述。 裝飾器的實現利用了python中閉包的特性,閉包基於python中一切皆物件的規則,如函式物件可以被當作返回值丟擲,list、dict等結構可以儲存物件或函式等。 外層函式的返回值為內層函式的引用,這樣形式的巢狀函式被稱為閉包,即例子中decorator函式。 裝飾器即定義一個閉包,但是它接收的引數是一個函式(即需要被裝飾的函式),這個傳入的函式,最終流轉進閉包中內層函式。由於閉包的特性,內層函式的引用最終被外層函式作為返回值丟擲,接收並處理這個返回值即可。
裝飾器的使用過程: 原有函式: 函式執行: hi(12345678) 執行結果: 1234578
裝飾過程: 使用裝飾器: a=decorator(hi) hi=a 可簡化: hi=decorator(hi) 函式執行: hi(12345678) 執行結果: start 12345678 stop 可以看到在不改變原函式在上下文呼叫的情況下,在原函式基礎上增加了功能 python中通過一個語法糖簡化以上過程,即
@decorator def hi(x):... hi(12345678)