多层装饰器
作者:互联网
1 def decorate1(func1): 2 def wrapper1(): 3 print(f'wrapper1--->{wrapper1}') 4 print('---decorate1 start---') 5 print(f'func1--->{func1}') 6 func1() 7 print('---decorate1 end---') 8 return wrapper1 9 10 def decorate2(func2): 11 def wrapper2(): 12 print(f'wrapper2--->{wrapper2}') 13 print('---decorate2 start---') 14 print(f'func2--->{func2}') 15 func2() 16 print('---decorate2 end---') 17 return wrapper2 18 19 @decorate2 20 @decorate1 21 def demo(): 22 print('Hello World') 23 24 print(f'demo--->{demo}') 25 demo() 26 27 #结果: 28 demo---><function decorate2.<locals>.wrapper2 at 0x7f51c3f42430> 29 wrapper2---><function decorate2.<locals>.wrapper2 at 0x7f51c3f42430> 30 ---decorate2 start--- 31 func2---><function decorate1.<locals>.wrapper1 at 0x7f51c3f423a0> 32 wrapper1---><function decorate1.<locals>.wrapper1 at 0x7f51c3f423a0> 33 ---decorate1 start--- 34 func1---><function demo at 0x7f51c3f42310> 35 Hello World 36 ---decorate1 end--- 37 ---decorate2 end---
运行过程:
1、加载1~12行
2、执行20行,func1 = demo
3、执行8行,demo = decorate1.wrapper1(存疑)
4、执行19行,func2 = decorate1.wrapper1
5、执行17行,demo = decorate2.wrapper2
6、执行24行,从结果28行可以发现demo指向的是decorate2.wrapper2
7、执行25行,相当于执行11~16行
8、在步骤7执行过程中,12~13执行完毕后(对应结果29和30行),执行14行func2指向的是decorate1.wrapper1(对应结果31行)
9、接着步骤7中继续执行15行,由于func2指向decorate1.wrapper1,所以跳转到第2行开始执行
10、接着步骤9,开始执行2~7行,先执行3~4(对应结果32~33),接着执行5行,从结果34可以看到,func1执行demo
11、接着步骤10,开始执行6~7行,对应结果35~36行,最后执行16行,对应结果37行
标签:wrapper1,demo,decorate2,多层,decorate1,---,print,装饰 来源: https://www.cnblogs.com/panlj/p/15365014.html