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

