裝飾器使用過程當中,若是須要一個參數來判斷裝飾器是否啓用時,就須要傳入一個參數,來判斷是否啓用。閉包
目前裝飾器,傳輸函數名給外部函數作參數,內部函數參數用作調用函數的參數,沒法實現參數的傳遞。函數
所以,須要在加一層嵌套,來實現參數的傳入,裝飾器最多三層!!!this
import time from functools import wraps FLAG = True def out_warpper(flag): def warpper(f): @wraps(f) def w_in(): if flag: print("this is warp!") ret = f() else: ret = f() return ret return w_in return warpper # out_warpper = out_warpper(FLAG) → out_warpper = warpper # func1 = warpper(func1) → func1 = w_in @out_warpper(FLAG) # func1 def func1(): time.sleep(1) print("this is func1")
@out_warpper(FLAG) def func2(): time.sleep(1) print("this is func2") func1() func2()
三層時,先執行@符號後的行數,即out_warpper = out_warpper(FLAG) ,返回 out_warpper = warpper,閉包函數,存下了變量flag。spa
在執行@函數名,func1 = warpper(func1) ,返回func1 = w_in,從而實現了傳參數的裝飾器。code
def warper1(f): def inner(): print("begin do inner1!") f() print("after go inner1!") return inner def warper2(f): def inner(): print("begin do inner2!") f() print("after go inner2!") return inner def warper3(f): def inner(): print("begin do inner3!") f() print("after go inner3!") return inner @warper3 @warper2 @warper1 def func(): print("this is func") func()
多個裝飾器裝飾一個函數,函數前,從最外層裝飾器,執行到最內層 → 執行函數 → 在從最內層開始,往外執行blog