国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

Python如何解除一個(gè)裝飾器

瀏覽:3日期:2022-07-14 16:50:50

問題

一個(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 wrapsdef decorator1(func): @wraps(func) def wrapper(*args, **kwargs): print(’Decorator 1’) return func(*args, **kwargs) return wrapperdef decorator2(func): @wraps(func) def wrapper(*args, **kwargs): print(’Decorator 2’) return func(*args, **kwargs) return wrapper@decorator1@decorator2def add(x, y): return x + y

下面我們在Python3.3下測試:

>>> add(2, 3)Decorator 1Decorator 25>>> add.__wrapped__(2, 3)5>>>

下面我們在Python3.4下測試:

>>> add(2, 3)Decorator 1Decorator 25>>> add.__wrapped__(2, 3)Decorator 25>>>

最后要說的是,并不是所有的裝飾器都使用了 @wraps ,因此這里的方案并不全部適用。 特別的,內(nèi)置的裝飾器 @staticmethod 和 @classmethod 就沒有遵循這個(gè)約定 (它們把原始函數(shù)存儲(chǔ)在屬性 __func__ 中)。

以上就是Python如何解除一個(gè)裝飾器的詳細(xì)內(nèi)容,更多關(guān)于Python 解除裝飾器的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 新蔡县| 鹤峰县| 香港 | 平江县| 磴口县| 双江| 滨海县| 昔阳县| 基隆市| 洛阳市| 临高县| 西贡区| 龙井市| 临夏县| 彩票| 田林县| 张家口市| 通辽市| 桃园市| 玉屏| 武鸣县| 玛纳斯县| 化隆| 富宁县| 岳普湖县| 安泽县| 神木县| 岐山县| 镇坪县| 南召县| 湖北省| 桦南县| 兴和县| 蒙山县| 长沙市| 家居| 英德市| 东辽县| 二连浩特市| 高州市| 石河子市|