【文件属性】:
文件名称:将装饰器定义为类-华为云大数据中台架构分享
文件大小:5.68MB
文件格式:PDF
更新时间:2021-06-11 11:14:05
Python cookbook 中文 参考
9.9 将装饰器定义为类
问题
你想使用一个装饰器去包装函数,但是希望返回一个可调用的实例。 你需要让
你的装饰器可以同时工作在类定义的内部和外部。
解决方案
为了将装饰器定义成一个实例,你需要确保它实现了 __call__() 和 __get__() 方
法。 例如,下面的代码定义了一个类,它在其他函数上放置一个简单的记录
层:
import types
from functools import wraps
class 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)
你可以将它当做一个普通的装饰器来使用,在类里面或外面都可以:
@Profiled
def add(x, y):
return x + y
class Spam:
@Profiled
def bar(self, x):