1. 类装饰器基础概念
在Python中,装饰器是一种强大的语法特性,它允许我们在不修改原函数代码的情况下,为函数添加额外的功能。类装饰器则是装饰器的一种实现形式,它使用类而不是函数来实现装饰器的功能。
类装饰器与普通函数装饰器的主要区别在于,类装饰器可以利用类的特性来维护状态。这意味着我们可以在装饰器内部保存一些数据,这些数据会在多次调用被装饰函数时保持存在。这种特性使得类装饰器特别适合需要维护状态的装饰场景。
注意:类装饰器虽然功能强大,但也会带来额外的复杂性。在不需要维护状态的简单场景下,函数装饰器通常是更简洁的选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 类装饰器的实现原理
2.1 基本结构
一个最简单的类装饰器实现如下:
python复制class MyDecorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("Before function call")
result = self.func(*args, **kwargs)
print("After function call")
return result
这个类装饰器的工作流程是:
- 当装饰器被应用时,
__init__方法会被调用,传入被装饰的函数 - 当被装饰的函数被调用时,实际上是调用了装饰器实例的
__call__方法 __call__方法中可以添加额外的逻辑,然后调用原始函数
2.2 带参数的类装饰器
有时候我们需要装饰器本身也能接受参数。这种情况下,我们需要稍微修改类装饰器的结构:
python复制class ParametrizedDecorator:
def __init__(self, *args, **kwargs):
# 这里接收装饰器参数
self.args = args
self.kwargs = kwargs
def __call__(self, func):
def wrapper(*args, **kwargs):
print(f"Decorator args: {self.args}")
print(f"Decorator kwargs: {self.kwargs}")
return func(*args, **kwargs)
return wrapper
这种带参数的类装饰器使用时是这样的:
python复制@ParametrizedDecorator(debug=True, level=2)
def my_function():
pass
3. 类装饰器的实际应用
3.1 性能计时装饰器
一个常见的应用场景是测量函数执行时间:
python复制import time
class Timer:
def __init__(self, func):
self.func = func
self.total
