在Python类装饰器的世界里,你不仅可以使用函数来装饰其他函数,还可以利用类来实现更强大、更灵活的装饰逻辑。本教程将带你从零开始理解什么是类装饰器,为什么需要它,以及如何自己动手编写一个实用的类装饰器。无论你是刚接触Python面向对象编程的新手,还是想深入理解装饰器设计模式的开发者,这篇文章都能让你受益匪浅。
装饰器本质上是一个“包装”函数或类的工具,用于在不修改原代码的前提下增强其功能。常见的装饰器是函数形式的,但类装饰器则是通过定义一个类,并实现特定的魔术方法(如 __call__)来达到装饰目的。
类装饰器的核心在于:当一个类被用作装饰器时,它会被实例化,并且该实例必须是可调用的(即实现了 __call__ 方法)。
让我们从最简单的例子开始。下面这个类装饰器会在被装饰函数执行前后打印日志:
class LogDecorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print(f"[LOG] 调用函数: {self.func.__name__}") result = self.func(*args, **kwargs) print(f"[LOG] 函数 {self.func.__name__} 执行完毕") return result# 使用装饰器@LogDecoratordef greet(name): return f"你好, {name}!"# 调用greet("小明") 运行结果:
[LOG] 调用函数: greet[LOG] 函数 greet 执行完毕
在这个例子中,LogDecorator 是一个类装饰器。当我们将 @LogDecorator 放在 greet 函数上方时,Python 会自动执行 greet = LogDecorator(greet)。之后每次调用 greet(),实际上是在调用 LogDecorator 实例的 __call__ 方法。
有时我们希望装饰器能接收参数,比如指定日志级别或前缀。这时我们需要再嵌套一层——让类的 __init__ 接收装饰器参数,而 __call__ 返回真正的装饰器函数。
class RepeatDecorator: 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# 使用带参数的装饰器@RepeatDecorator(times=3)def say_hello(): print("Hello!")say_hello() 输出:
Hello!Hello!Hello!
注意这里的关键区别:RepeatDecorator(times=3) 先被调用,返回一个可调用对象(即 RepeatDecorator 的实例),然后这个实例再去装饰 say_hello 函数。
类装饰器非常适合需要维护状态的场景。例如,我们可以实现一个简单的缓存(记忆化)装饰器:
class Memoize: def __init__(self, func): self.func = func self.cache = {} def __call__(self, *args, **kwargs): # 将参数转为可哈希的键(简化处理,仅适用于不可变参数) key = str(args) + str(sorted(kwargs.items())) if key not in self.cache: self.cache[key] = self.func(*args, **kwargs) return self.cache[key]@Memoizedef fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2)print(fibonacci(30)) # 第一次计算较慢,但结果会被缓存print(fibonacci(30)) # 第二次直接从缓存读取,极快 这个例子展示了如何利用类装饰器的实例变量(self.cache)来保存状态,从而实现函数增强技巧中的性能优化。
通过本文,你已经学会了:
记住,类装饰器并不是为了取代函数装饰器,而是为你提供另一种更强大的工具。当你需要在装饰过程中保存状态、管理资源或实现复杂逻辑时,类装饰器往往是更好的选择。
现在,你可以尝试自己动手写一个计时器装饰器、权限验证装饰器,或者重试机制装饰器——这些都是提升你 Python类装饰器 实战能力的好方法!
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124249.html