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

其中主要的就是兩個(gè)變量:
1、顯示 正在執(zhí)行的函數(shù)的名稱 f.name
2、顯示 正在執(zhí)行的函數(shù)的注釋 f.doc
簡(jiǎn)單來(lái)說(shuō)就是:
如果沒(méi)使用@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的名稱,
這也即使常說(shuō)的@wraps是裝飾器的修復(fù)技術(shù),
實(shí)際就是修復(fù)還原了A的__ name__變量,同理__ doc__變量也是一樣。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)vlog生成器的示例代碼
vlog,全稱為Video?blog,意為影音博客,也有翻譯為微錄。本文將嘗試用Python基于Moviepy從一個(gè)文本文件中自動(dòng)生成一個(gè)視頻格式的vlog,感興趣的可以了解一下2023-01-01
PyTorch簡(jiǎn)單手寫(xiě)數(shù)字識(shí)別的實(shí)現(xiàn)過(guò)程
Pytorch是熱門的深度學(xué)習(xí)框架之一,通過(guò)經(jīng)典的MNIST數(shù)據(jù)集進(jìn)行快速的pytorch入門,這篇文章主要給大家介紹了關(guān)于PyTorch簡(jiǎn)單手寫(xiě)數(shù)字識(shí)別的相關(guān)資料,需要的朋友可以參考下2021-11-11
Python3合并兩個(gè)有序數(shù)組代碼實(shí)例
這篇文章主要介紹了Python3合并兩個(gè)有序數(shù)組代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Keras: model實(shí)現(xiàn)固定部分layer,訓(xùn)練部分layer操作
這篇文章主要介紹了Keras: model實(shí)現(xiàn)固定部分layer,訓(xùn)練部分layer操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python高級(jí)過(guò)濾器之filter函數(shù)詳解
在Python中,filter()是一個(gè)非常有用的內(nèi)置函數(shù),它能夠根據(jù)指定的函數(shù)來(lái)篩選出可迭代對(duì)象中滿足條件的元素,本文將從入門到精通,全面介紹filter()函數(shù)的用法和相關(guān)知識(shí)點(diǎn)2023-08-08
Python?PyQt5?開(kāi)啟線程防止界面卡死閃退問(wèn)題解決
這篇文章主要介紹了Python?PyQt5?開(kāi)啟線程避免界面卡死閃退,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06

