在之前的帖子中,简单自我总结了装饰器的几个情况以及基本上使用,那么有基本上说的都是单个的装饰器修饰方法
有时候我们会发现一个方法上面有多个装饰器
如下:
@dec2
@dec
def a(a):
if a:
print('raise')
raise ConnectionAbortedError
print(3)
return 'a'
看到这类的装饰器那么我们该如何理解呢?
回答这个问题前,我们需要知道当执行到a这个方法时,装饰器是如何工作和加载的?
首先我们把dec 和 dec2分别实现
def dec(func):
print('进入dec')
def innner(*args):
f = func(*args)
print(1)
return f, 'dec'
return innner
def dec2(func2):
print('进入dec2')
def inner(*args):
f = func2(*args)
print(2)
return f, 'dec2'
return inner
按照如上的dec和dec2, 我们可以了解一下几个知识
- 装饰器的装饰顺序
- 装饰后的被装饰函数的方法返回结果顺序
执行后的结果


如上图中的,通过结果可以看出
-
装饰器的执行顺序时自下而上的,看结果中打印的 312,如果dec2在下面则打印的是321(可以对比下图)
颠倒顺序后比对图
-
对应返回结果的装饰也存在执行顺序,下一个装饰的方法返回值,接收的是上一个装饰方法的返回结果如图中的((('a', 'dec'), 'dec2'))首先返回f,‘dec’ ,然后下一个装饰器f接收的就是dec的(f, 'dec'),在返回(('a', 'dec'), 'dec2')
网友评论