日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Python如何將裝飾器定義為類

瀏覽:22日期:2022-07-15 18:32:49

問題

你想使用一個裝飾器去包裝函數,但是希望返回一個可調用的實例。 你需要讓你的裝飾器可以同時工作在類定義的內部和外部。

解決方案

為了將裝飾器定義成一個實例,你需要確保它實現了 __call__() 和 __get__() 方法。 例如,下面的代碼定義了一個類,它在其他函數上放置一個簡單的記錄層:

import typesfrom functools import wrapsclass Profiled: def __init__(self, func): wraps(func)(self) self.ncalls = 0 def __call__(self, *args, **kwargs): self.ncalls += 1 return self.__wrapped__(*args, **kwargs) def __get__(self, instance, cls): if instance is None: return self else: return types.MethodType(self, instance)

你可以將它當做一個普通的裝飾器來使用,在類里面或外面都可以:

@Profileddef add(x, y): return x + yclass Spam: @Profiled def bar(self, x): print(self, x)

在交互環境中的使用示例:

>>> add(2, 3)5>>> add(4, 5)9>>> add.ncalls2>>> s = Spam()>>> s.bar(1)<__main__.Spam object at 0x10069e9d0> 1>>> s.bar(2)<__main__.Spam object at 0x10069e9d0> 2>>> s.bar(3)<__main__.Spam object at 0x10069e9d0> 3>>> Spam.bar.ncalls3

討論

將裝飾器定義成類通常是很簡單的。但是這里還是有一些細節需要解釋下,特別是當你想將它作用在實例方法上的時候。

首先,使用 functools.wraps() 函數的作用跟之前還是一樣,將被包裝函數的元信息復制到可調用實例中去。

其次,通常很容易會忽視上面的 __get__() 方法。如果你忽略它,保持其他代碼不變再次運行, 你會發現當你去調用被裝飾實例方法時出現很奇怪的問題。例如:

>>> s = Spam()>>> s.bar(3)Traceback (most recent call last):...TypeError: bar() missing 1 required positional argument: ’x’

出錯原因是當方法函數在一個類中被查找時,它們的 __get__() 方法依據描述器協議被調用, 在8.9小節已經講述過描述器協議了。在這里,__get__() 的目的是創建一個綁定方法對象 (最終會給這個方法傳遞self參數)。下面是一個例子來演示底層原理:

>>> s = Spam()>>> def grok(self, x):... pass...>>> grok.__get__(s, Spam)<bound method Spam.grok of <__main__.Spam object at 0x100671e90>>>>>

__get__() 方法是為了確保綁定方法對象能被正確的創建。 type.MethodType() 手動創建一個綁定方法來使用。只有當實例被使用的時候綁定方法才會被創建。 如果這個方法是在類上面來訪問, 那么 __get__() 中的instance參數會被設置成None并直接返回 Profiled 實例本身。 這樣的話我們就可以提取它的 ncalls 屬性了。

如果你想避免一些混亂,也可以考慮另外一個使用閉包和 nonlocal 變量實現的裝飾器,這個在9.5小節有講到。例如:

import typesfrom functools import wrapsdef profiled(func): ncalls = 0 @wraps(func) def wrapper(*args, **kwargs): nonlocal ncalls ncalls += 1 return func(*args, **kwargs) wrapper.ncalls = lambda: ncalls return wrapper# Example@profileddef add(x, y): return x + y

這個方式跟之前的效果幾乎一樣,除了對于 ncalls 的訪問現在是通過一個被綁定為屬性的函數來實現,例如:

>>> add(2, 3)5>>> add(4, 5)9>>> add.ncalls()2>>>

以上就是Python如何將裝飾器定義為類的詳細內容,更多關于Python將裝飾器定義為類的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人久久精品一区二区三区| 欧美日韩日本国产亚洲在线| 午夜精品亚洲| 亚洲精品在线观看91| 在线亚洲精品| 日韩精彩视频在线观看| 日韩一区二区三免费高清在线观看 | 亚洲精品护士| 日韩国产在线观看| 国产私拍福利精品视频二区| 国产精品porn| 欧美羞羞视频| 巨乳诱惑日韩免费av| 日本亚州欧洲精品不卡| 久久国产精品美女| 日韩电影免费在线观看| 国产亚洲精品v| 日韩精品一区二区三区免费视频 | 欧美中文字幕| 欧美精品导航| 久久视频一区| 亚洲毛片在线免费| 捆绑调教日本一区二区三区| 欧美在线资源| 你懂的网址国产 欧美| 久久香蕉国产| 国产欧美自拍一区| 欧美精选一区二区三区| 国产精品久久久久久久久久白浆 | 午夜精品免费| 麻豆91精品视频| 久久99伊人| 日韩成人免费| 亚洲小说春色综合另类电影| 久久只有精品| 视频一区二区国产| 91日韩欧美| 国产伦精品一区二区三区在线播放| 91精品精品| 加勒比视频一区| 日韩欧美四区| 手机精品视频在线观看| 99久久婷婷| 日韩伦理一区| 国产麻豆精品| 日本欧美一区二区在线观看| 黄色在线一区| 国产综合激情| 国产传媒在线| 久久99久久人婷婷精品综合| 日韩一区二区三免费高清在线观看| 亚洲三区欧美一区国产二区| 日韩中文视频| 成人午夜网址| 亚洲青青久久| 欧美中文日韩| 亚洲国内欧美| 秋霞影视一区二区三区| 在线精品视频在线观看高清| 精品国产18久久久久久二百| 日韩欧美四区| 日韩精品中文字幕一区二区| 蜜桃视频免费观看一区| 亚洲激情av| 伊人成人在线视频| 欧美精品黄色| 精品亚洲美女网站| 日韩精品欧美| 久久精品国产亚洲夜色av网站 | yellow在线观看网址| 国产欧美日韩在线观看视频 | 一区在线免费| 亚洲一区二区av| 日本成人在线视频网站| 国产精品一区二区精品| 麻豆视频一区二区| 亚洲成人国产| 日本亚洲不卡| 精品久久久中文字幕| 99热精品久久| 亚洲欧美久久精品| 精品久久一区| 热久久久久久久| 蜜桃久久久久| 成人在线免费观看网站| 亚州av乱码久久精品蜜桃| 日韩国产精品久久久久久亚洲| 欧美久久久网站| 极品裸体白嫩激情啪啪国产精品| 三级欧美在线一区| 精品一区二区三区在线观看视频| 精品三级久久| 91精品日本| 怡红院精品视频在线观看极品| 国产精品宾馆| 蜜桃91丨九色丨蝌蚪91桃色| 精品视频91| 日韩av在线免费观看不卡| 激情欧美亚洲| 国产日产一区| 久久午夜视频| 日韩一区二区中文| 欧美激情日韩| 日韩黄色免费网站| 欧美日韩国产免费观看| 国产成人a视频高清在线观看| 亚洲精品乱码| 亚洲制服少妇| 自由日本语亚洲人高潮| 久久电影tv| 你懂的亚洲视频| 日韩欧美美女在线观看| 欧美日韩第一| 久久久成人网| 精品一区电影| 国产精品探花在线观看| 亚洲欧美专区| 亚洲丝袜美腿一区| 视频一区二区国产| 国产精品普通话对白| 亚洲精品a级片| 免费观看不卡av| 欧美精品自拍| 国产精品日韩| 免费观看不卡av| 欧美日韩国产高清| 一本一本久久| 亚洲一级大片| 国产日产精品_国产精品毛片| 蜜桃久久av一区| 涩涩涩久久久成人精品| 香蕉久久久久久| 日韩国产在线观看| 欧美日韩中出| 久久不卡日韩美女| 亚洲一级二级| 久久精品国产成人一区二区三区| 日韩不卡手机在线v区| 日韩高清电影免费| 久久狠狠亚洲综合| 欧美片网站免费| 久久黄色影视| a国产在线视频| 亚洲精品护士| 亚洲另类黄色| 国产精品麻豆成人av电影艾秋| 国产经典一区| 成人精品亚洲| 亚洲精品伊人| 成人台湾亚洲精品一区二区| 国产99久久| 欧美亚洲免费| 日韩天堂在线| 亚洲精品字幕| 久久久久久久欧美精品| 91tv亚洲精品香蕉国产一区| 中国女人久久久| 国产日韩在线观看视频| 高清不卡一区| 亚洲精品a级片| 日本不卡视频一二三区| 国产毛片精品| 久久香蕉国产| 久久影院一区二区三区| 欧美极品中文字幕| 久久精品av| 日韩激情一二三区| 国产传媒av在线| 亚洲国产一区二区三区在线播放| 美国欧美日韩国产在线播放| 久久精品三级| 亚洲人www| 国产精品88久久久久久| 美女久久精品| 亚洲精品动态| av中文字幕在线观看第一页| 欧美日韩四区| 亚洲天堂免费电影| 麻豆精品蜜桃视频网站| 亚洲免费影院| 亚洲国产专区| 日韩成人亚洲| 精品视频高潮| 亚洲1区在线| 欧美手机在线| 久久久成人网| 亚洲人成在线网站| 三上亚洲一区二区| 福利片在线一区二区| 欧美成人aaa| 国产精品大片免费观看| 欧美一区久久| 国产日韩一区二区三免费高清| 亚洲不卡视频| 三级久久三级久久久| 在线观看免费一区二区| 免费毛片在线不卡| 欧美成人日韩| 久久中文视频| 欧美高清不卡|