Python多个装饰器的顺序 转载
Posted Eric
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多个装饰器的顺序 转载相关的知识,希望对你有一定的参考价值。
3、使用两个装饰器
当一个装饰器不够用的话,我们就可以用两个装饰器,当然理解起来也就更复杂了,当使用两个装饰器的话,首先将函数与内层装饰器结合然后在与外层装饰器相结合,要理解@语法的时候到底执行了什么,是理解装饰器的关键。这里还是用最简单的例子来进行说明。
1 def outer2(func2): 2 def inner2(*args,**kwargs): 3 print(\'开始\') 4 r=func2(*args,**kwargs) 5 print(\'结束\') 6 return r 7 return inner2 8 9 def outer1(func1): 10 def inner1(*args,**kwargs): 11 print(\'start\') 12 r=func1(*args,**kwargs) 13 print(\'end\') 14 return r 15 return inner1 16 17 @outer2 # 这里相当于执行了 f=outer1(f) f=outer2(f),步骤如下 18 @outer1 #1、f=outer1(f) f被重新赋值为outer1(1)的返回值inner1, 19 def f(): # 此时func1为 f():print(\'f 函数\') 20 print(\'f 函数\') #2、f=outer2(f) 类似f=outer2(inner1) f被重新赋值为outer2的返回值inner2 21 # 此时func2 为inner1函数 inner1里面func1函数为原来的 f():print(\'f 函数\') 22 23 f() # 相当于执行 outer2(inner1)() 24 25 #执行结果如下: 26 开始 # 在outer函数里面执行,首先打印 ‘开始 ’ 27 start # 执行func2 即执行inner1函数 打印 ‘start’ 28 f 函数 # 在inner1函数里面执行 func1 即f()函数,打印 ‘f 函数’ 29 end # f函数执行完,接着执行inner1函数里面的 print(\'end\') 30 结束 # 最后执行inner2函数里面的 print(\'结束\')
python执行代码的时候碰到两个装饰器解释过程:
1、将@outer1和f()先执行:函数outer1()将返回值inner1重新赋值给f,此时f指向的函数体是inner1的函数体,这里称f为新f
2、执行@outer:@outer2将新f当作参数传入inner2(),然后将返回值inner2重新赋值给f,此时f指向的函数体是inner2的函数体
执行过程和解释过程是相反的:从上到下的,先通过第一层@outer2 -----> @outer1 -------> f(),结合执行结果你就很明白了。
以上是关于Python多个装饰器的顺序 转载的主要内容,如果未能解决你的问题,请参考以下文章