裝飾器

裝飾器

?????為了動態(tài)拓展函數(shù),而不去破壞原函數(shù)的調(diào)用,產(chǎn)生了裝飾器。通常使用裝飾器給函數(shù)加log。

單層裝飾器

def trim(f):
    def inner(*args,**kwargs):
        print("1"*10)
        ret = f(*args,**kwargs)
        print("1"*10)
        return ret
    return inner

"""
@trim : func = trim(func)
"""
@trim
def func(*args,**kwargs):
    for i,j in enumerate(*args):
        print(i,j)
    print(kwargs)
    return args

if __name__ == '__main__':
    func([1,3],name="hhh")
單層裝飾器.png

?????以上是一個(gè)單層裝飾器,trim是裝飾函數(shù),func是被裝飾函數(shù)。@trim是Python中的一顆語法糖,它等價(jià)于func = trim(func)。


執(zhí)行過程.png

?????使用func.__name__查看func的名字可以發(fā)現(xiàn)它其實(shí)是inner。

tips:

  • 如果被裝飾函數(shù)沒有參數(shù) ,inner也可以不用帶參數(shù),但是如果被裝飾函數(shù)有了參數(shù),inner函數(shù)必須帶有參數(shù),因?yàn)樵趇nner函數(shù)中調(diào)用func時(shí),必須要有參數(shù),這時(shí)的參數(shù)只能來自于inner。一般來說,無論被裝飾函數(shù)有沒有參數(shù),我們都會給inner兩個(gè)參數(shù),一個(gè)可變參數(shù),一個(gè)關(guān)鍵字參數(shù)。
  • 同樣如果被裝飾函數(shù)有返回值,需要在inner中調(diào)用func進(jìn)行保存,然后在inner中返回這個(gè)值

多層裝飾器

def trim(f):
    def inner(*args,**kwargs):
        print("1"*10)
        ret = f(*args,**kwargs)
        print("1"*10)
        return ret
    return inner

def wrap(f):
    def wahia(*args,**kwargs):
        print("2"*10)
        ret = f(*args,**kwargs)
        print("2"*10)
        return ret
    return wahia

"""
@wrap : func = wrap(func)
@trim : func = trim(func)
"""
@wrap
@trim
def func(*args,**kwargs):
    for i,j in enumerate(*args):
        print(i,j)
    print(kwargs)
    return args

if __name__ == '__main__':
    func([1,3],name="hhh")
    # print(func.__name__)
多層裝飾器.png

?????多層裝飾器的時(shí)候,要注意位置,位置不同所產(chǎn)生的結(jié)果也會不同。以上是func先被trim裝飾,返回inner,此時(shí)func = inner,在此之上再被wrap裝飾,返回wahia。所以func.__name__是wahia。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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