多个装饰器
多个装饰器可以应用在一个函数上,它们的调用顺序是自下而上的。
下面给大家举例演示。
def wrap_one(func):
print('--正在装饰1--')
def inner():
print('--正在验证权限1--')
func()
return inner
def wrap_two(func):
print('--正在装饰2--')
def inner():
print('--正在验证权限2--')
func()
return inner
@wrap_one
@wrap_two
def test():
print('---test---')
# 调用test,调用test之前,已经装饰过了
test()
上述代码中,test()函数上面有两个装饰器,按照多个装饰器从下往上的调用顺序,程序首先会执行@wrap_two,再执行@wrap_one。下面,我们一步一步来分析程序的执行过程。
(1)程序将wrap_one、wrap_two、test函数加载到内存中,加载完成后如图1所示。
图1 将函数加载到内存
(2)test()函数上有两个装饰器,首先程序会执行@wrap_two,也就是test=wrap_two(test),执行完毕后的内存如图2所示。
图2 执行@wrap_two
(3)执行@wrap_one,也就是test=wrap_one(test),这个过程执行完毕后,其实,装饰器对函数的装饰已经完成,会输出下列语句:
--正在装饰2--
--正在装饰1--
装饰后的函数关系如图3所示。
图3 执行@wrap_one
(4)装饰完毕后,如果使用“test()”语句调用test函数,程序会按照从上向下的顺序运行,最终程序的输出结果为:
--正在验证权限1--
--正在验证权限2--
---test---