在Python的魔法工具箱中,装饰器(Decorator) 无疑是提升代码可读性和复用性的利器。它像一位隐形的造型师,为函数“披上外衣”而不改其核心逻辑。
核心原理
装饰器本质是一个高阶函数,接收目标函数作为参数,返回一个新函数。它利用闭包特性,在不修改原函数代码的前提下注入额外行为。
def logger(func):
def wrapper(args, **kwargs):
print(f"[LOG] 调用 {func.name}")
return func(args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
print(add(3, 5)) # 输出: [LOG] 调用 add → 8
经典应用场景
日志记录:跟踪函数调用(如上方示例)
性能监控:
import time
def timer(func):
def wrapper(args, **kwargs):
start = time.time()
result = func(args, kwargs)
print(f"耗时: {time.time()-start:.4f}s")
return result
return wrapper
权限验证:Web框架中常用(如Flask的@login_required)
缓存优化:functools.lru_cache装饰器实现记忆化
进阶技巧
带参数的装饰器:通过嵌套函数实现
def repeat(n):
def decorator(func):
def wrapper(*args, kwargs):
for _ in range(n):
result = func(args, *kwargs)
return result
return wrapper
return decorator
类装饰器:通过call方法实现状态管理
多装饰器堆叠:执行顺序从下往上(如@A @B def f() → B→A)
为什么值得用?
代码解耦:将非核心逻辑(如日志、验证)抽离
DRY原则:避免重复代码
可读性:@decorator语法比显式嵌套更直观
注意:过度装饰会增加调试复杂度,建议用functools.wraps保留原函数元数据。
结语
掌握装饰器,如同获得Python的“超能力”。它不仅是语法糖,更是设计模式的实践。尝试用它重构你的项目,让代码既简洁又强大!