【python多装饰器执行顺序--代码实例解析】

python多装饰器执行顺序--代码实例解析

# -*- coding:utf-8 -*-


def set_func1(func):
    print("set_fun1执行了")

    def call_fun(*args, **kwargs):
        print("call_fun1执行了")
        return func(*args, **kwargs)

    return call_fun


def set_func2(func):
    print("set_fun2执行了")

    def call_fun(*args, **kwargs):
        print("call_fun1执行了")
        return func(*args, **kwargs)

    return call_fun


@set_func2
@set_func1
def test():
    return "test is show"


print(test())

代码的执行过程是

1、首先定义了两个装饰器函数set_func1与set_func2,这两个函数都会打印出一句话,并返回一个闭包。
2、接着定义了一个函数test,并给这个函数添加了两个装饰器。Python会首先执行离函数最近的装饰器,也就是set_func1,因此会首先打印出 “set_fun1执行了”。
3、然后返回set_func1的闭包给set_func2,set_func2执行,打印出 “set_fun2执行了”,返回set_func2的闭包给test函数。
4、调用print(test())会执行test函数,这个函数实际上已经被替换成了set_func2的闭包,因此会打印出 “call_fun1执行了”。
5、因为set_func2的闭包中还调用了set_func1的闭包,所以再次打印出 “call_fun1执行了”,然后执行test函数,返回 “test is show”。

所以,执行结果为:

set_fun1执行了

set_fun2执行了

call_fun1执行了

call_fun1执行了

test is show

总结:

1、如果不好理解调用过程,可以记为:由近到远执行装饰器,由远到近执行闭包,最后执行函数;
装饰器1–>装饰器2–>装饰器2的闭包–>装饰器1的闭包–>执行函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值