Python裝飾器如何實現(xiàn)修復(fù)過程解析
Python裝飾器(decorator)在實現(xiàn)的時候,被裝飾后的函數(shù)其實已經(jīng)是另外一個函數(shù)了(函數(shù)名等函數(shù)屬性會發(fā)生改變),
為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現(xiàn)之前加上functools的wrap,
它能保留原有函數(shù)的名稱和docstring。
未加@wraps的時候:
from functools import wraps
def wrapper(func):
# @wraps(func)
def inner(*args, **kwargs):
print("裝飾器工作中...")
func(*args, **kwargs)
return inner
@wrapper
def f1(arg):
"""
這是一個測試裝飾器修復(fù)技術(shù)的函數(shù)
:param arg: 隨便傳
:return: 沒有
"""
print(arg)
f1('呵呵')
print(f1.__name__,f1.__doc__)
打印結(jié)果是:

但是加上@wraps以后:
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
print("裝飾器工作中...")
func(*args, **kwargs)
return inner
@wrapper
def f1(arg):
"""
這是一個測試裝飾器修復(fù)技術(shù)的函數(shù)
:param arg: 隨便傳
:return: 沒有
"""
print(arg)
f1('呵呵')
print(f1.__name__,f1.__doc__)
打印結(jié)果是:

其中主要的就是兩個變量:
1、顯示 正在執(zhí)行的函數(shù)的名稱 f.name
2、顯示 正在執(zhí)行的函數(shù)的注釋 f.doc
簡單來說就是:
如果沒使用@wraps,當(dāng)A調(diào)用了裝飾器B的話,即使A.name,返回的會是裝飾器B的函數(shù)名稱,而不是A的函數(shù)名稱
如果使用了@wraps,當(dāng)A調(diào)用了裝飾器B的話,A.__ name__返回的會是A函數(shù)的名稱,而不是飾器B的名稱,
這也即使常說的@wraps是裝飾器的修復(fù)技術(shù),
實際就是修復(fù)還原了A的__ name__變量,同理__ doc__變量也是一樣。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Numpy數(shù)據(jù)轉(zhuǎn)換成image并保存的實現(xiàn)示例
本文主要介紹了Numpy數(shù)據(jù)轉(zhuǎn)換成image并保存的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
Python urlencode和unquote函數(shù)使用實例解析
這篇文章主要介紹了Python urlencode和unquote函數(shù)使用實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Python統(tǒng)計某列不同值的個數(shù)的示例代碼
在數(shù)據(jù)分析和數(shù)據(jù)處理中,統(tǒng)計數(shù)據(jù)往往集中在特定列中不同值的出現(xiàn)次數(shù),本文主要介紹了Python統(tǒng)計某列不同值的個數(shù)的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-03-03
python 實現(xiàn)檢驗33品種數(shù)據(jù)是否是正態(tài)分布
今天小編就為大家分享一篇python 實現(xiàn)檢驗33品種數(shù)據(jù)是否是正態(tài)分布,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

