Python装饰器是不修改原函数代码而动态增强其功能的高阶函数,本质为接收函数并返回新函数;支持无参、带参及内置装饰器如@property、@lru_cache等,使用时需注意元信息丢失、性能影响和叠加顺序。

Python装饰器是一种用于修改或增强函数行为的简洁工具,它不改变原函数代码,却能动态添加功能,比如日志记录、权限校验、性能计时等。
装饰器的本质:函数套函数
装饰器本质上是一个接受函数作为参数、并返回新函数的高阶函数。最简形式如下:
def my_decorator(func):
def wrapper():
print("调用前执行")
func()
print("调用后执行")
return wrapper
使用 @my_decorator 语法糖,等价于 func = my_decorator(func),让代码更清晰可读。
立即学习“Python免费学习笔记(深入)”;
带参数的装饰器:支持灵活配置
当需要为不同函数传入不同配置(如重试次数、超时时间)时,需再嵌套一层函数:
- 外层函数接收装饰器参数(如 retries=3)
- 中间层接收被装饰的函数
- 内层 wrapper 执行实际逻辑,可访问所有层级变量
例如实现一个可配置重试次数的装饰器,就能复用于多个网络请求函数,无需重复写重试逻辑。
常用内置装饰器与典型场景
Python标准库提供了几个高频实用的装饰器:
- @property:把方法变成属性调用,适合封装计算属性(如 obj.area)
- @staticmethod 和 @classmethod:定义类级别的行为,不依赖实例状态
- @functools.lru_cache:自动缓存函数结果,显著提升递归或重复调用性能
- 自定义 @log_execution 或 @require_auth:统一处理日志、鉴权等横切关注点
注意事项与最佳实践
使用装饰器时容易忽略几个关键细节:
- 被装饰函数的 __name__、__doc__ 等元信息默认会丢失,需用 @functools.wraps(func) 修复
- 装饰器本身应尽量轻量,避免在 wrapper 中做耗时操作,否则影响所有被装饰函数
- 多个装饰器叠加时注意执行顺序:从下往上装饰,从上往下运行(即 @a 在 @b 下方,则先执行 a 的 wrapper,再进入 b 的 wrapper)










