Python随记:【Python装饰器(二)】——装饰器执行流程

模块加载 ->> 遇到@,执行timer函数,传入add函数 ->> 生成timer..wrapper函数并命名为add,其实是覆盖了原同名函数 ->> 调用add(1, 2) ->> 去执行timer..wrapper(1, 2) ->> wrapper内部持有原add函数引用(func),调用func(1, 2) ->>继续执行完wrapper函数。

注意:

1)如果一个函数被多个修饰器增强,执行顺序执行【洋葱原则】:可以把装饰器想象成洋葱,由近及远对
函数进行层层包裹,执行的时候就是拿一把刀从一侧开始切,直到切到另一侧结束。
在这里插入图片描述
2)经过装饰器之后,真正被调用的是装饰后生成的新函数,为了消除装饰器对原函数的影响,保证被装饰后的函数还拥有原来的属性,可以通过functools.wraps来将生成的新函数“伪装”成原函数,拥有原函数的属性,看起来就像是同一个函数一样。functools.wraps内部通过partial和update_wrapper对函数进行再加工,将原始被装饰函数(add)的属性拷贝给装饰器函数(wrapper)

def auth(permission):
    def _auth(func):
        @functools.wraps(func) # 注意此处
        def wrapper(*args, **kwargs):
            print(f"验证权限[{permission}]...")
            func(*args, **kwargs)
            print("执行完毕...")

        return wrapper

    return _auth

@auth("add")
def add(a, b):
    """
    求和运算
    """
    print(a + b)

print(add)
print(add.__name__)
print(add.__doc__)

## 输出:
>> <function add at 0x10997c488>
>> add
>> 求和运算
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值