Python 一个函数多个装饰器的调用顺序(非多重)

def deco1(func):

    print("In deco1, not in fun")
    def deco1Fun():

        print("in deco1, in fun start")
        func()
        print("deco1 fun end")

    return deco1Fun


def deco2(func):

    print("in deco2, not in fun")
    def deco2Fun():

        print("in deco2, in fun start")
        func()
        print("deco2 fun end")

    return deco2Fun


@deco1
@deco2
def func():

    print("func is called")


func()

输出:

也就是说各语句的执行顺序为:

1、deco1寻找自己周围的函数,没有找到。

"""

@deco

def func():

    pass

func()   # 我的理解应该是:先更改func,即func = deco(func), 把func传入deco, 此时并没有执行函数,然后func() 执行更改后的函数。然后往下看

"""

2、deco2寻找自己周围的函数,找到了,是func, 那么就把func作为参数传入(此时还没有执行func函数)

3、现在进入了deco2(func), func为主函数中的函数被传入,那么就会执行1号语句(上图红1标出的语句),然后注意下方是函数的定义(deco2内部的deco2Fun(), 这个函数内部的fun()函数为deco2的参数,就是主函数传进来的func),此时没有执行deco2内部的deco2Fun, 也没有deco2Fun内部的语句(包括内部的fun :主函数的func函数),把deco2内部的deco2Fun返回,此时还是没有执行函数。

4、deco2结束,此时相当于在@deco1的下方“出现了”一个函数(刚刚deco2返回的deco2内部的deco2Fun),那么此时@deco1周围就相当于出现了函数。那么deco1就把这个函数(deco2内部的deoc2Fun)作为参数传入(deco1)

5、现在进入了deco1(deoc2Fun),那么执行2号语句,下方又是一个函数的定义,这个函数(deco1内部的deco1Fun)内有一个func函数的执行,这个函数是deco1传入的参数,也就是deco2内部的deco2Fun, (还是都没有执行),把deco1内部的deco1Fun函数返回。

6、此时主函数中func(), 就已经相当于 deco1Fun() 了(因为func被装饰器修改,修改过程在2上方:先是func = deco1(func), 再执行func(),     func = deco1(func) 就是把deco1的返回值(deco1Fun)赋值给func, 所以func相当于deco1Fun)

7、执行func(), 相当于执行deco1Fun(), 就是deco1内部的deoc1Fun执行,即3号语句,然后3号语句下方是deco1Fun函数内部的func函数,在第5条已说明,deco1Fun()内部的func函数即为deco1的参数(deco2内部的deco2Fun函数),那么执行这个func()函数就相当于执行了deco2内部的deco2Fun()

8、那么此时语句就进入了deco2Fun执行4号语句,往下deco2的decoFun内部的func()函数即为deco2的参数,即为主函数中的func函数(刚刚作为参数传入deco2,见第3条),那么就执行5号语句,此时deoc2内部deco2Fun内部的func()执行完成,继续向下。

9、执行6号语句,deco2Fun函数执行完成,也就意味着deco1内部的deco1Fun下的func()执行完成,刚才递归调用,一直还在执行这个函数,现在deco1Fun下的func()才完成。

10、往下7号语句,至此,主函数中的func() 正式完成。(相当于deco1Fun(func))

 

 

以上步骤为个人理解,如有错误,还望指正。

 

参考:

https://my.oschina.net/u/3900854/blog/2242199

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值