Python如何解除一個(gè)裝飾器
問題
一個(gè)裝飾器已經(jīng)作用在一個(gè)函數(shù)上,你想撤銷它,直接訪問原始的未包裝的那個(gè)函數(shù)。
解決方案
假設(shè)裝飾器是通過 @wraps 來實(shí)現(xiàn)的,那么你可以通過訪問 __wrapped__ 屬性來訪問原始函數(shù):
>>> @somedecorator >>> def add(x, y): ... return x + y ... >>> orig_add = add.__wrapped__ >>> orig_add(3, 4) 7 >>>
討論
直接訪問未包裝的原始函數(shù)在調(diào)試、內(nèi)省和其他函數(shù)操作時(shí)是很有用的。 但是我們這里的方案僅僅適用于在包裝器中正確使用了 @wraps
或者直接設(shè)置了 __wrapped__
屬性的情況。
如果有多個(gè)包裝器,那么訪問 __wrapped__
屬性的行為是不可預(yù)知的,應(yīng)該避免這樣做。 在Python3.3中,它會(huì)略過所有的包裝層,比如,假如你有如下的代碼:
from functools import wraps def decorator1(func): @wraps(func) def wrapper(*args, **kwargs): print('Decorator 1') return func(*args, **kwargs) return wrapper def decorator2(func): @wraps(func) def wrapper(*args, **kwargs): print('Decorator 2') return func(*args, **kwargs) return wrapper @decorator1 @decorator2 def add(x, y): return x + y
下面我們在Python3.3下測試:
>>> add(2, 3) Decorator 1 Decorator 2 5 >>> add.__wrapped__(2, 3) 5 >>>
下面我們在Python3.4下測試:
>>> add(2, 3) Decorator 1 Decorator 2 5 >>> add.__wrapped__(2, 3) Decorator 2 5 >>>
最后要說的是,并不是所有的裝飾器都使用了 @wraps
,因此這里的方案并不全部適用。 特別的,內(nèi)置的裝飾器 @staticmethod
和 @classmethod
就沒有遵循這個(gè)約定 (它們把原始函數(shù)存儲(chǔ)在屬性 __func__
中)。
以上就是Python如何解除一個(gè)裝飾器的詳細(xì)內(nèi)容,更多關(guān)于Python 解除裝飾器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python運(yùn)用于數(shù)據(jù)分析的簡單教程
這篇文章主要介紹了Python運(yùn)用于數(shù)據(jù)分析的簡單教程,主要介紹了如何運(yùn)用Python來進(jìn)行數(shù)據(jù)導(dǎo)入、變化、統(tǒng)計(jì)和假設(shè)檢驗(yàn)等基本的數(shù)據(jù)分析,需要的朋友可以參考下2015-03-03關(guān)于pyqt5控件自適應(yīng)窗口超詳細(xì)知識點(diǎn)匯總
這篇文章主要介紹了關(guān)于pyqt5控件自適應(yīng)窗口超詳細(xì)知識點(diǎn)匯總,有了布局,再在布局中放置各種控件,我們就能讓控件實(shí)現(xiàn)自適應(yīng)的效果,需要的朋友可以參考下2023-03-03conda創(chuàng)建環(huán)境過程出現(xiàn)"Solving?environment:?failed"報(bào)錯(cuò)的詳細(xì)解
很長一段時(shí)間沒用conda了,然后突然使用conda創(chuàng)建環(huán)境報(bào)錯(cuò),所以下面這篇文章主要給大家介紹了關(guān)于conda創(chuàng)建環(huán)境過程出現(xiàn)"Solving?environment:?failed"報(bào)錯(cuò)的詳細(xì)解決方法,需要的朋友可以參考下2022-11-11Flask的url_for和request.url如何進(jìn)行URL判斷
這篇文章主要介紹了Flask的url_for和request.url如何進(jìn)行URL判斷問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07pandas重置索引標(biāo)簽的實(shí)現(xiàn)示例
在使用Pandas進(jìn)行數(shù)據(jù)處理時(shí),有時(shí)候我們可能會(huì)需要對數(shù)據(jù)進(jìn)行重置索引的操作,本文主要介紹了pandas重置索引標(biāo)簽的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04