Python装饰器入门教程_函数增强与应用场景

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

Python装饰器是一种用于修改或增强函数行为的简洁工具,它不改变原函数代码,却能动态添加功能,比如日志记录、权限校验、性能计时等。

装饰器的本质:函数套函数

装饰器本质上是一个接受函数作为参数、并返回新函数的高阶函数。最简形式如下:

  def my_decorator(func):
    def wrapper():
      print("调用前执行")
      func()
      print("调用后执行")
    return wrapper

使用 @my_decorator 语法糖,等价于 func = my_decorator(func),让代码更清晰可读。

带参数的装饰器:支持灵活配置

当需要为不同函数传入不同配置(如重试次数、超时时间)时,需再嵌套一层函数:

  • 外层函数接收装饰器参数(如 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)