Python裝飾器如何實(shí)現(xiàn)修復(fù)過程解析
Python裝飾器(decorator)在實(shí)現(xiàn)的時(shí)候,被裝飾后的函數(shù)其實(shí)已經(jīng)是另外一個(gè)函數(shù)了(函數(shù)名等函數(shù)屬性會(huì)發(fā)生改變),
為了不影響,Python的functools包中提供了一個(gè)叫wraps的decorator來消除這樣的副作用。寫一個(gè)decorator的時(shí)候,最好在實(shí)現(xiàn)之前加上functools的wrap,
它能保留原有函數(shù)的名稱和docstring。
未加@wraps的時(shí)候:
from functools import wrapsdef wrapper(func): # @wraps(func) def inner(*args, **kwargs): print('裝飾器工作中...') func(*args, **kwargs) return inner@wrapperdef f1(arg): ''' 這是一個(gè)測試裝飾器修復(fù)技術(shù)的函數(shù) :param arg: 隨便傳 :return: 沒有 ''' print(arg)f1(’呵呵’)print(f1.__name__,f1.__doc__)
打印結(jié)果是:
但是加上@wraps以后:
from functools import wrapsdef wrapper(func): @wraps(func) def inner(*args, **kwargs): print('裝飾器工作中...') func(*args, **kwargs) return inner@wrapperdef f1(arg): ''' 這是一個(gè)測試裝飾器修復(fù)技術(shù)的函數(shù) :param arg: 隨便傳 :return: 沒有 ''' print(arg)f1(’呵呵’)print(f1.__name__,f1.__doc__)
打印結(jié)果是:
其中主要的就是兩個(gè)變量:
1、顯示 正在執(zhí)行的函數(shù)的名稱 f.name
2、顯示 正在執(zhí)行的函數(shù)的注釋 f.doc
簡單來說就是:
如果沒使用@wraps,當(dāng)A調(diào)用了裝飾器B的話,即使A.name,返回的會(huì)是裝飾器B的函數(shù)名稱,而不是A的函數(shù)名稱
如果使用了@wraps,當(dāng)A調(diào)用了裝飾器B的話,A.__ name__返回的會(huì)是A函數(shù)的名稱,而不是飾器B的名稱,
這也即使常說的@wraps是裝飾器的修復(fù)技術(shù),
實(shí)際就是修復(fù)還原了A的__ name__變量,同理__ doc__變量也是一樣。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 利用單元測試對(duì)PHP代碼進(jìn)行檢查2. python如何實(shí)現(xiàn)word批量轉(zhuǎn)HTML3. python excel和yaml文件的讀取封裝4. moment轉(zhuǎn)化時(shí)間戳出現(xiàn)Invalid Date的問題及解決5. Java8內(nèi)存模型PermGen Metaspace實(shí)例解析6. python3實(shí)現(xiàn)往mysql中插入datetime類型的數(shù)據(jù)7. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊8. python 實(shí)現(xiàn)圍棋游戲(純tkinter gui)9. python 基于Appium控制多設(shè)備并行執(zhí)行10. Python加載數(shù)據(jù)的5種不同方式(收藏)
