在Python高级编程中,装饰器是一个强大而优雅的特性。除了常见的函数装饰器,Python类装饰器同样重要,尤其在面向对象编程场景中。本教程将带你从基础概念出发,一步步掌握Python装饰器教程中的类装饰器用法,即使是编程小白也能轻松上手!
类装饰器是使用类来实现装饰器功能的一种方式。与函数装饰器不同,它利用类的 __call__ 方法,使类的实例可以像函数一样被调用。
类装饰器相比函数装饰器有以下优势:
要创建一个类装饰器,你需要在类中实现 __init__ 和 __call__ 方法:
class MyDecorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print("装饰器执行前...") result = self.func(*args, **kwargs) print("装饰器执行后...") return result@MyDecoratordef greet(name): print(f"Hello, {name}!")greet("Alice") 运行结果:
有时我们需要向装饰器传递参数。这时,类装饰器需要三层嵌套结构:
class Repeat: def __init__(self, times=1): self.times = times def __call__(self, func): def wrapper(*args, **kwargs): for _ in range(self.times): result = func(*args, **kwargs) return result return wrapper@Repeat(times=3)def say_hello(): print("Hello!")say_hello() 输出将会是三次 “Hello!”。这里 Repeat 类本身接收参数 times,然后它的 __call__ 方法返回真正的装饰器函数 wrapper。
下面是一个实用的类装饰器,用于统计函数执行时间:
import timeclass Timer: def __init__(self, func): self.func = func self.total_time = 0 def __call__(self, *args, **kwargs): start = time.time() result = self.func(*args, **kwargs) end = time.time() elapsed = end - start self.total_time += elapsed print(f"{self.func.__name__} 执行耗时: {elapsed:.4f} 秒") return result def get_total_time(self): return self.total_time@Timerdef slow_function(): time.sleep(0.5) return "完成"slow_function()print(f"累计耗时: {slow_function.get_total_time():.4f} 秒") | 特性 | 类装饰器 | 函数装饰器 ||------|----------|------------|| 状态保持 | ✅ 容易(实例变量) | ❌ 需要闭包或nonlocal || 可读性 | ✅ 结构清晰 | ⚠️ 嵌套较深时难读 || 性能 | ⚠️ 略慢(对象创建开销) | ✅ 更轻量 || 复用性 | ✅ 支持继承 | ❌ 仅靠函数组合 |
通过本篇Python装饰器教程,你已经掌握了面向对象装饰器的核心用法。类装饰器不仅让你的代码更具结构性,还能轻松管理状态和扩展功能。无论你是初学者还是进阶开发者,掌握这一技巧都将极大提升你的Python高级编程能力。
小贴士:在实际项目中,如果逻辑简单,优先使用函数装饰器;若需维护状态或复杂行为,类装饰器是更优选择。
本文由主机测评网于2025-12-09发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125389.html