1. 程式人生 > >10-5裝飾器進階_帶參數的裝飾器、多個裝飾器裝飾同一個函數

10-5裝飾器進階_帶參數的裝飾器、多個裝飾器裝飾同一個函數

image star 結果 一個 -- sta highlight 是否 bsp

帶參數的裝飾器

只用在裝飾器最外層嵌套一個即可,以達到輕易控制裝飾器函數是否執行的作用

import time
flag = False
def timmer_outer(flag):
        def timmer(func):
            def innner(*args,**kwargs):
                if flag:
                    start = time.time()
                    ret = func(*args,**kwargs)
                    end = time.time()
                    print(end-start)
                    return ret
                else:
                    ret = func(*args, **kwargs)
                    return ret
            return innner
        return timmer
#執行步驟:兩步(timmer_outer(flag)執行後返回timmer,再執行@tmmer)
@timmer_outer(flag)
def func1():
    time.sleep(0.1)
    print("函數1")
@timmer_outer(flag)
def func2():
    time.sleep(0.1)
    print("函數2")
func1()
func2()

多個裝飾器裝飾同一個函數

def wrapper1(func):#func-->f
    def inner1():
        print("wrapper1,before f")
        ret = func()
        func()  #f()
        print("wrapper1,after f ")
        return ret
    return inner1
def wrapper2(func):
    def inner2():
        print("wrapper2,before f")
        ret = func()
        func()  #inner1()
        print("wrapper2,after f ")
        return ret
    return inner2
#f=wrapper2(f) = f=wrapper2(inner1) = inner2
@wrapper2
#   f=wrapper1(f) = inner1
@wrapper1
def f():
    print("in f")
    return ‘娃哈哈‘
print(f())

結果:

wrapper2,before f
wrapper1,before f
in f
wrapper1,after f
wrapper2,after f
娃哈哈

技術分享圖片

技術分享圖片

10-5裝飾器進階_帶參數的裝飾器、多個裝飾器裝飾同一個函數