python多层装饰器运行逻辑简单理解

# 装饰器一
def check_permission_1(func):
    print(1)
    def deco1(*args, **kwargs):
        print(2)
        res = func(*args, **kwargs)
        print(3)
        return res
    print(4)
    return deco1
# 装饰器二
def check_permission_2(func):
    print(5)
    def deco2(*args, **kwargs):
        print(6)
        res = func(*args, **kwargs)
        print(7)
        return res
    print(8)
    return deco2
@check_permission_1
@check_permission_2
def test():
    print('hello world')

如上所示,test函数上面嵌套了两层装饰器,那么,它们的层级和运行顺序是怎么样的呢?

首先,装饰器是自下而上运行的。装饰器2装饰了test函数,成为了一个新的函数,然后这个新的函数又被装饰器1装饰了,总的来说,就是这样的结构:

check_permission_1(check_permission_2(test))

那么以上的输出是怎么样呢?如下:
1、装饰器2装饰了test函数,那么就变成了这样的函数:

def check_permission_2(test):
    print(5)
    def deco2(*args, **kwargs):
        print(6)
        res = test(*args, **kwargs)
        print(7)
        return res
    print(8)
    return deco2

那么,输出顺序必然是 5, 8,接着将deco当做返回值返回外层的装饰器。

2、返回的deco函数被装饰器1装饰,那么就变成这样的函数:

# 装饰器一
def check_permission_1(deco2):
    print(1)
    def deco1(*args, **kwargs):
        print(2)
        res = deco2(*args, **kwargs)
        print(3)
        return res
    print(4)
    return deco1

那么,输出顺序必然是 1, 4,接着将deco1返回外层装饰器,这时发现外层没有装饰器了,就直接执行deco1

那么这时候输出显然是 2,然后接着执行deco2,输出 6,然后执行test,输出 hello world, 然后输出 7,最后输出3

发布了63 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_30966497/article/details/98040660