def w1(func): print("正在装饰1") def inner(): print("----正在验证权限1----") func() return inner def w2(func1): print("正在装饰2") def inner1(): print("----正在验证权限2----") func1() return inner1 @w1 #相当于f1=w1(f1) @w2 #相当于f2=w2(f2) def f1(): print("————f1———————") print("装饰器f1已经装饰完毕") print() @w2 #相当于f1=w1(f1) @w1 #相当于f2=w2(f2) # #多个装饰器装饰的时候是从下往上装饰,装饰器执行到这里的时候一定会执行w1里面的东西,返回了内部函数的引用地址
#一旦执行到@w2这句话的时候就会执行f2=w2(f2),相当于f2指向了innter2的引用地址,func2指向了外部f2函数引用地址,当执行func2()函数的时候相当于执行f2()函数的功能代码块 def f2(): print("————f2———————") print("装饰器f2已经装饰完毕") print() print("-------调用函数f1----") f1() #调用函数的时候,装饰器是按照装饰器的顺序执行。 print("f1函数调用完毕") print() print("-------调用函数f2----") f2() print("f2函数装饰完毕")
下面是执行代码的结果:D:\python3.6\pythonw.exe F:/python项目/09Day/02python核心编程/02装饰器/04多个装饰器.py
正在装饰2
正在装饰1
装饰器f1已经装饰完毕
正在装饰1
正在装饰2
装饰器f2已经装饰完毕
-------调用函数f1----
----正在验证权限1----
----正在验证权限2----
————f1———————
f1函数调用完毕
-------调用函数f2----
----正在验证权限2----
----正在验证权限1----
————f2———————
f2函数装饰完毕