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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值