Python装饰器是什么?一文教你搞懂烦人的Python装饰器!!

发布时间:2026/9/8 17:39:19
Python装饰器是什么?一文教你搞懂烦人的Python装饰器!! 对于学习java的人来说应该知道装饰器是在java中的一种设计模式作用是包装对象场景类似IO流但在python中他的应用就比较广了本质就是语法糖高阶函数用函数包装函数Java 装饰器 用类包装对象运行时动态组合功能Python 装饰器 用函数包装函数定义时静态替换功能一句话概括python中的装饰器就是装饰器 不修改原函数和调用方式给函数额外加一层功能另外python还结合了语法糖举个例子就是加日志def log(): print(我在加班) log()输出就是 我在加班加上日志的话就是这样def log(): print(fINFO_日志开始) print(我在加班) print(fINFO_日志结束) log()输出就是INFO_日志开始 我在加班 INFO_日志结束但是这样就改变了原来的函数本身可能会影响他本来的功能我们有个想法就是将他抽出来def fun(): print(我在上班) def logs(func): print(INFO_日志开始) func() print(INFO_日志结束) logs(fun) 输出就是 INFO_日志开始 我在上班 INFO_日志结束不改函数本身也不改调用方式和闭包的写法差不多只不过装饰器接受的是一个函数装饰器一般就干三件事接收一个函数作为参数嵌套一个 wrapper 函数——在里面调用原函数并附加额外功能返回这个 wrapper 函数一般通用的写法就是用语法糖代替示例话那个函数写法就如下面这样from functools import wraps def cat(func): count 0 wraps(func) #作用保留原来函数的__name__、__doc__名称和注解 wraps 本身是一个有参装饰器它接收 func 作为参数然后把 func 的属性复制给 wrapper def wrapper(*args,**kwargs): nonlocal count count 1 print(f第{count}次调用) return func(*args,**kwargs) return wrapper #直接调用就是 语法糖省略了 c cat(say) c() cat def say(): print(hello) say()输出就是这样第1次调用 hello小结装饰器 闭包 语法糖——不改原函数、不改调用方式给函数加功能wrapper 用*args, **kwargs接所有参数有返回值要 return带参数的装饰器 三层嵌套别忘了functools.wraps装饰器也可以加入参def log(level): def decorator(func): def wrapper(*args, **kwargs): print(f[{level}] 开始执行) result func(*args, **kwargs) print(f[{level}] 执行结束) return result return wrapper return decorator log(levelINFO) def hello(): print(hi) hello()输入为[INFO] 开始执行 hi [INFO] 执行结束写装饰器时必须加 wraps(func) 来保留原函数的 __name__ 和 __doc__wrapper 的参数要写成 *args, **kwargs 来通吃所有参数wrapper 内部一定要 return func(*args, **kwargs) 把原函数的结果传出去使用时无参装饰器不加括号、有参装饰器才加括号多个装饰器叠加时从下往上执行离函数最近的先执行。装饰器在python中经常用来做web路由权限校验日志计时缓存等类似java中的aop切面和缓存等或者公共模块