优雅的魔法:用Python装饰器为函数“穿新衣”
在Python中,有一种强大的语法糖,能让你在不修改原函数代码的情况下为其添加新功能——这就是装饰器。它就像给函数穿上一件“外衣”,而这件外衣可以赋予函数日志记录、性能监测、权限验证等能力。
什么是装饰器?
本质上,装饰器是一个高阶函数,它接收一个函数作为参数,并返回一个新的函数。这种“函数包装”的模式,完美遵循了“开放-封闭”原则:对扩展开放,对修改封闭。
一个简单示例
假设我们需要为多个函数添加执行时间记录功能:
import time
import functools
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行耗时: {end-start:.2f}秒")
return result
return wrapper
@timer
def process_data(n):
time.sleep(1)
return sum(range(n))
# 调用时自动计时
result = process_data(1000)
装饰器的妙用
除了性能监测,装饰器还能用于:
- 身份验证:检查用户权限
- 日志记录:自动记录函数调用信息
- 缓存:实现记忆化功能,存储计算结果
- 错误处理:统一异常捕获和重试机制
- 参数验证:检查输入参数的有效性
最佳实践
- 使用
@functools.wraps保留原函数的元信息 - 保持装饰器单一职责,每个装饰器只做一件事
- 考虑使用带参数的装饰器来增加灵活性
- 注意装饰器顺序对执行顺序的影响
装饰器是Pythonic编程的典范之一,它将横切关注点与业务逻辑优雅分离。掌握这一特性,你的代码将变得更加简洁、可维护和强大。从简单的@staticmethod到复杂的类装饰器,这片天地值得深入探索。