15.python裝飾器進階之功能與結(jié)構(gòu)

1. 裝飾器的主要功能和裝飾器的固定結(jié)構(gòu)

  • 在不改變函數(shù)調(diào)用方式的基礎上在函數(shù)的前、后添加功能。

2. 裝飾器的固定格式

2.1 裝飾器的固定格式

def timer(func):
    def inner(*args,**kwargs):
        '''執(zhí)行函數(shù)之前要做的'''
        re = func(*args,**kwargs)
        '''執(zhí)行函數(shù)之后要做的'''
        return re
    return inner

2.2 wraps版裝飾器固定格式

from functools import wraps

def deco(func):
    @wraps(func) #加在最內(nèi)層函數(shù)正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

3. 帶參數(shù)的裝飾器

假如你有成千上萬個函數(shù)使用了一個裝飾器,現(xiàn)在你想把這些裝飾器都取消掉,你要怎么做?

一個一個的取消掉? 沒日沒夜忙活3天。。。

過兩天你領導想通了,再讓你加上。。。

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''執(zhí)行函數(shù)之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''執(zhí)行函數(shù)之后要做的''')
            return re
        return inner
    return timer

# False時不裝飾,True時裝飾
@outer(False)
def func():
    print(111)

func()

4. 多個裝飾器裝飾同一個函數(shù)

def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner2

@wrapper2
@wrapper1 # 從下往上執(zhí)行
def func():
    print('in f')

func()

當多個裝飾器裝飾同一個函數(shù)時,裝飾器的運行順序是從下到上的,比如上面這個f函數(shù),裝飾器運行的順序應當是wrapper1 ->wrapper2

分析函數(shù)func的運行過程

  1. 傳入wrapper1 的方法是func
  2. 傳入wrapper2的方法是運行wrapper1返回的inner1
  3. 執(zhí)行函數(shù)func
  4. 執(zhí)行wrapper1 后續(xù)代碼
  5. 執(zhí)行wrapper2后續(xù)代碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容