多个装饰器的装饰过程是: 离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程
我们来看一下代码
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