其他分享
首页 > 其他分享> > 多层装饰器

多层装饰器

作者:互联网

 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