多个装饰器:装饰过程

 

  多个装饰器的装饰过程是: 离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程

  我们来看一下代码


def decorator1(func):
    def wrapper(*args, **kwargs):
        print('decorator1')
        return func(*args, **kwargs)

    return wrapper


def decorator2(func):
    def wrapper(*args, **kwargs):
        print('decorator2')
        return func(*args, **kwargs)

    return wrapper
 
@decorator2   
@decorator1
def get(self):
    return {'msg': 'get view'}

通过上面代码可以看到 @decorator2 在 @decorator1上面,按照由内到外的装饰过程,首先应该先装饰@decorator1,然后在装饰

@decorator2 ;转换一下就清楚了:decorator2  ( decorator1(get) )

def decorator1(func):
    def wrapper(*args, **kwargs):
        print('decorator1')
        return func(*args, **kwargs)

    return wrapper


  @decorator1 相当于 get = decorator1(get) 简写 decorator1->get 装饰过程中打印的信息只有在wrapper函数中,外部没有任何的操作,故装饰过程并无任何的打印信息,注意一点装饰过程只是返回了wrapper对象,没有去执行。

  为什么说没有执行呢,因为如果要执行的话,是需要使用get()才执行,这只是个装饰过程

   @decorator2  相当于 get = decorator2(get) 即decorator2 -> get 这里的get是@decorator1装饰后的decorator1.wrapper,即

get = decorator2(  decorator1(get)   ),同样也仅仅是装饰并没有调用,故也不会有任何的打印

  当使用注解调用时,首先调用的是@decorator2 装饰器,decorator2  装饰器运行时调内部方法decorator2.wrapper,打印信息后,去返回func对象,然后发现func对象是@decorator1装饰的方法故,执行decorator1装饰器,所以结果就是


decorator2
decorator1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值