1. Python类装饰器深度解析
在Python开发中,装饰器(Decorator)是提升代码复用性和可维护性的利器。而基于类的装饰器(Class-based Decorator)相比函数式装饰器,提供了更强大的封装能力和状态管理特性。我第一次在真实项目中应用类装饰器,是为了实现一个带缓存机制的API调用限流器,从此对这种模式有了全新认识。
类装饰器的核心优势在于它能保持装饰状态(通过实例属性)、实现更复杂的初始化逻辑,并且天然支持面向对象的继承和多态特性。下面通过六个关键维度,带你彻底掌握这种进阶装饰器实现方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 类装饰器核心机制剖析
2.1 类装饰器基本结构
一个最简类装饰器实现如下:
python复制class SimpleDecorator:
def __init__(self, func):
self.func = func # 保存被装饰函数
def __call__(self, *args, **kwargs):
print(f"Calling {self.func.__name__}")
return self.func(*args, **kwargs)
@SimpleDecorator
def greet(name):
return f"Hello, {name}"
print(greet("Alice"))
# 输出:
# Calling greet
# Hello, Alice
关键点解析:
__init__接收被装饰函数并进行初始化__call__使得实例可像函数一样调用- 装饰器实例会替换原函数,因此需要手动调用保存的原函数
2.2 带参数的类装饰器
当需要配置装饰器行为时,需要支持参数传递:
python复制class ParametrizedDecorator:
def __init__(self, max_calls=3):
self.max_calls = max_calls
def __call__(self, func):
self.func = func
self.call_count = 0
return self._wrapper
def _wrapper(self, *args, **kwargs):
if self.call_count >= self.max_calls:
raise RuntimeError("Max calls exceeded")
self.call_count += 1
return self.func(*args, **kwargs)
