python全棧闖關--12-裝飾器進階

帶參數的裝飾器

裝飾器使用過程當中,若是須要一個參數來判斷裝飾器是否啓用時,就須要傳入一個參數,來判斷是否啓用。閉包

目前裝飾器,傳輸函數名給外部函數作參數,內部函數參數用作調用函數的參數,沒法實現參數的傳遞。函數

所以,須要在加一層嵌套,來實現參數的傳入,裝飾器最多三層!!!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

相關文章
相關標籤/搜索