在Python装饰器15的章节中提到使用类作为装饰器之后,函数的属性发生变化,在之前是使用@wrap(func)
,同理使用类作为装饰器也有类似的方法的来实现。
正确使用类作为装饰器
from functools import wraps
class Profiled:
def __init__(self, func):
wraps(func)(self)
# self.func = func
def __call__(self, *args, **kwargs):
print("call")
return self.__wrapped__(*args, **kwargs)
@Profiled
def add(x, y):
return x + y
print(add.__name__)
result = add(1, 2)
print(result)
执行结果:
add
call
3
发现结果是预期的了。
根据Python官网文档, wraps(func)(self)
本质是为类实例增加一个__wrapped__
作为类实例属性,所以self.__wrapped__
本质就是add
函数。
小结
现在我们已经会将类作为装饰器正确使用了,似乎定义了__call__
方法就什么问题就解决了,那么真的是如此吗?