装饰器原理与应用
装饰器在 Python 中扮演着'化妆师'的角色,它能在不修改原函数代码的前提下,动态地为函数添加新功能。
本质与机制
从本质上讲,装饰器是一个接收函数作为参数并返回新函数的工具。其核心依赖于两个概念:
- 函数即对象:Python 中的函数可以像变量一样传递,这是装饰器的基础。
- 闭包机制:通过嵌套函数保留原函数引用,并包裹新的逻辑层。
实际调用流程通常是这样的:当你调用被装饰的函数时,Python 执行的是经过装饰器加工后的新函数。新函数会先执行装饰逻辑(如权限检查),再调用原函数。
常见应用场景
| 场景 | 作用 | 类比 |
|---|---|---|
| 权限验证 | 检查用户是否登录后再执行 | 进小区前的门禁系统 |
| 日志记录 | 自动记录调用时间和参数 | 飞机的黑匣子 |
| 性能统计 | 计算函数运行耗时 | 跑步时的计时手表 |
| 缓存结果 | 避免重复计算(如 @lru_cache) | 备忘录复用答案 |
实现方式与注意事项
最常用的方式是函数式装饰器,通过嵌套函数实现。例如给函数添加'呼叫提醒'功能:
def remind_call(func):
def wrapper():
print("【提醒】开始打电话...")
func()
print("【提醒】通话结束")
return wrapper
@remind_call
def call_friend():
print("正在和好友通话中...")
call_friend()
输出结果为:
【提醒】开始打电话...
正在和好友通话中...
【提醒】通话结束
此外还有类装饰器,通过实现 __call__ 方法让类可调用,适合需要维护状态的场景(如重试计数器)。
在实际使用中需要注意几个坑:
- 原函数信息丢失:直接使用装饰器会导致
help(func)显示 wrapper 的信息。解决方法是使用functools.wraps装饰 wrapper 函数。

