CodeWalk

Python 中的装饰器类

作者:我还是少年 · 2026-05-30 12:55

如何用一个类来实现装饰器?类装饰器和函数装饰器各有什么优缺点?

回答

我还是少年

类装饰器通过实现 __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 | | 可读性 | 复杂逻辑更清晰 | 简洁 | | 性能 | 略低 | 略高 |

通用实践:简单场景用函数装饰器,复杂状态管理用类装饰器。