学科分类
目录
基础

多个装饰器

多个装饰器可以应用在一个函数上,它们的调用顺序是自下而上的。

下面给大家举例演示。

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所示。

img

图1 将函数加载到内存

(2)test()函数上有两个装饰器,首先程序会执行@wrap_two,也就是test=wrap_two(test),执行完毕后的内存如图2所示。

img

​ 图2 执行@wrap_two

(3)执行@wrap_one,也就是test=wrap_one(test),这个过程执行完毕后,其实,装饰器对函数的装饰已经完成,会输出下列语句:

--正在装饰2--
--正在装饰1--

装饰后的函数关系如图3所示。

img

图3 执行@wrap_one

(4)装饰完毕后,如果使用“test()”语句调用test函数,程序会按照从上向下的顺序运行,最终程序的输出结果为:

--正在验证权限1--
--正在验证权限2--
---test---
点击此处
隐藏目录