

新闻资讯
技术学院Python装饰器本质是“函数的函数”,通过闭包在不修改原函数前提下动态附加日志、缓存、权限等横切逻辑,支持单层(无参)、双层(带参)及三层(工厂函数)结构,并需用@functools.wraps保留元信息。
Python装饰器本质是“函数的函数”,核心设计思路是在不修改原函数代码的前提下,动态附加新行为。它利用了Python中函数是一等对象(可赋值、可传参、可返回)的特性,通过闭包封装逻辑,实现运行时的功能增强。
最简装饰器由两层构成:外层接收被装饰函数,内层(包装函数)执行增强逻辑并调用原函数;若需支持参数化配置(如@retry(max_times=3)),则增加第三层——返回装饰器的工厂函数。
@functools.wraps(func)保留原函数的__name__、__doc__等元信息,否则调试和反射会出问题装饰器不是炫技
工具,而是为解决重复横切关注点而生。常见用途有日志记录、权限校验、缓存、重试、性能计时等,关键在于把通用逻辑从业务代码中剥离出来。
print(f"Calling {func.__name__}")和异常捕获后的日志输出@lru_cache):用字典或functools.lru_cache缓存返回值,需考虑参数是否可哈希PermissionError
多个装饰器叠加(如@auth @log @cache)时,实际等价于auth(log(cache(func))),即最靠近函数的装饰器最先执行,但其包装逻辑最内层。理解这点对调试和设计嵌套行为至关重要。
func() → 进入cache包装 → 进入log包装 → 进入auth包装 → 执行原函数auth → 出log → 出cache → 返回给调用方初学装饰器易陷入“过度抽象”或“隐式状态”陷阱。推荐按此路径演进:
new_func = my_dec(func); new_func())list做缓存),改用函数属性或外部存储async def定义包装函数,并用await调用原协程,不可混用同步/异步装饰器