Python装饰器:优雅的代码增强术
作者:TechTalker
日期:2023-10-15
在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的“超能力”。它不仅是语法糖,更是设计模式的实践。尝试用它重构你的项目,让代码既简洁又强大!