亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Python如何解除一個裝飾器

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

問題

一個裝飾器已經作用在一個函數上,你想撤銷它,直接訪問原始的未包裝的那個函數。

解決方案

假設裝飾器是通過 @wraps 來實現的,那么你可以通過訪問 __wrapped__ 屬性來訪問原始函數:

>>> @somedecorator>>> def add(x, y):... return x + y...>>> orig_add = add.__wrapped__>>> orig_add(3, 4)7>>>

討論

直接訪問未包裝的原始函數在調試、內省和其他函數操作時是很有用的。 但是我們這里的方案僅僅適用于在包裝器中正確使用了 @wraps 或者直接設置了 __wrapped__ 屬性的情況。

如果有多個包裝器,那么訪問 __wrapped__ 屬性的行為是不可預知的,應該避免這樣做。 在Python3.3中,它會略過所有的包裝層,比如,假如你有如下的代碼:

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 ,因此這里的方案并不全部適用。 特別的,內置的裝飾器 @staticmethod 和 @classmethod 就沒有遵循這個約定 (它們把原始函數存儲在屬性 __func__ 中)。

以上就是Python如何解除一個裝飾器的詳細內容,更多關于Python 解除裝飾器的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 久久久精品久久久久特色影视 | 国产在线观看成人免费视频 | 国产99热久久这里有精品999 | 不卡视频在线观看 | 国产浮力草草影院ccyy | 国产视频久久久久 | 黄色影院在线 | 亚洲精品日本一区二区在线 | 国产精品www视频免费看 | 精品国产一区二区三区不卡在线 | 一级免费黄色毛片 | 在线国产视频观看 | 9999网站| 免费看一级黄色大片 | 国产精品酒店视频免费看 | 亚洲一级片免费 | 国产在线视频一区二区三区 | 九九在线精品视频xxx | 免费的黄色小视频 | 麻豆视传媒短视频网站链接 | 国产真实伦偷精品 | 国产成人综合一区精品 | 亚洲精品第一页中文字幕 | 久久国产在线视频 | 国产精品久久久久一区二区 | 国产欧美日韩在线 | 99欧美精品 | 免费一级黄色 | 国产精品久久久影院 | 免费黄色网址大全 | 国产在线一区二区杨幂 | 99久久国产综合精品成人影院 | 51精品资源视频在线播放 | 成年女人在线观看 | 亚洲精品精品 | 欧美巨吊| 国产99视频精品免费视频免里 | 日韩a级在线 | 色婷婷在线播放 | 国产不卡在线蜜 | 一区二区三区久久精品 |