当前位置:首页 > Python > 正文

深入理解Python类装饰器(从零开始掌握面向对象的装饰器编程)

Python高级编程中,装饰器是一个强大而优雅的特性。除了常见的函数装饰器,Python类装饰器同样重要,尤其在面向对象编程场景中。本教程将带你从基础概念出发,一步步掌握Python装饰器教程中的类装饰器用法,即使是编程小白也能轻松上手!

什么是类装饰器?

类装饰器是使用类来实现装饰器功能的一种方式。与函数装饰器不同,它利用类的 __call__ 方法,使类的实例可以像函数一样被调用。

深入理解Python类装饰器(从零开始掌握面向对象的装饰器编程) Python类装饰器 Python装饰器教程 面向对象装饰器 Python高级编程 第1张

为什么使用类装饰器?

类装饰器相比函数装饰器有以下优势:

  • 可以保存状态(通过实例变量)
  • 结构更清晰,适合复杂逻辑
  • 便于复用和继承

基本语法:如何定义一个类装饰器

要创建一个类装饰器,你需要在类中实现 __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")

运行结果:

装饰器执行前...
Hello, 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} 秒")

类装饰器 vs 函数装饰器

| 特性 | 类装饰器 | 函数装饰器 ||------|----------|------------|| 状态保持 | ✅ 容易(实例变量) | ❌ 需要闭包或nonlocal || 可读性 | ✅ 结构清晰 | ⚠️ 嵌套较深时难读 || 性能 | ⚠️ 略慢(对象创建开销) | ✅ 更轻量 || 复用性 | ✅ 支持继承 | ❌ 仅靠函数组合 |

总结

通过本篇Python装饰器教程,你已经掌握了面向对象装饰器的核心用法。类装饰器不仅让你的代码更具结构性,还能轻松管理状态和扩展功能。无论你是初学者还是进阶开发者,掌握这一技巧都将极大提升你的Python高级编程能力。

小贴士:在实际项目中,如果逻辑简单,优先使用函数装饰器;若需维护状态或复杂行为,类装饰器是更优选择。