Python 装饰器“高级”使用
本文聚焦两个有意思的点
无参和有参装饰器。 @deco vs @deco(arg1,arg2)。
多层装饰器场景。
无参和有参装饰器
大部分文章,都会学习到无参和有参装饰器写法。这里不赘述,直接上兼容括号和无括号注解 (无参 vs 有参),高级+灵活。
复制代码
要点:
装饰器代码里三层函数。里面判断是否是无参调用还是调用,准确的说是不带括号调用还是带括号调用,根据不同是否方式,返回对应的函数。
分隔符 /,* 含义:
/ , 分割符号,前面表示只能是位置参数。这就限制了 func 参数只能位置参数传入,而不能通过 func=x 传入。
, 后面的参数只能是 k-v 传参。
有这两个分隔符参数限制,可以避免调用传参导致的错误。
多层装饰器场景
看例子
复制代码
解释期间,注解由下到上解释(执行)。距离目标方法最近的注解先被解释执行,可以理解为由内而外。
要点:类似洋葱
解释期间,由内而外
执行期间,由外而内
剥洋葱 @functools.wrap
另外,例子中发现 deco1 装饰器里 func 打印字符是 deco2_wrapper 字样。很容易理解,根据洋葱定律,外层包裹的是内层的,故 deco1 包裹的自然是 deco2 deco2_wrapper 方法。
那该怎么保留或获取原始被包裹方法的信息呢?
来,让我们剥洋葱!
这就需要借助工具:@functools.wrap
复制代码
@functools.wrap 详细原理,这里不深究了,只附带介绍下它的现象。
要点:自定义装饰器推荐必带 @functools.wrap 装饰器。
作者:Nisus
链接:https://juejin.cn/post/7398520872179843072
评论