Python 中的装饰器类
如何用一个类来实现装饰器?类装饰器和函数装饰器各有什么优缺点?
回答
我还是少年
类装饰器通过实现 __call__ 方法使实例可调用,可保存更复杂的状态。
class CountCalls:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f'Call {self.count} of {self.func.__name__}')
return self.func(*args, **kwargs)
@CountCalls
def say_hello():
print('Hello!')
say_hello() # Call 1 of say_hello
say_hello() # Call 2 of say_hello
类装饰器 vs 函数装饰器: | 特性 | 类装饰器 | 函数装饰器 | |------|---------|-----------| | 状态管理 | 自然(实例属性)| 需闭包变量 | | 元信息保留 | 需手动 | 可用 @wraps | | 可读性 | 复杂逻辑更清晰 | 简洁 | | 性能 | 略低 | 略高 |
通用实践:简单场景用函数装饰器,复杂状态管理用类装饰器。