Python多层装饰器执行顺序理解

最近在Python中遇到了修饰器(decorator)这个概念,一直不是十分理解。在看了python装饰器详解这篇博客后,对其的概念和用法有了一个大致的认识。但是,博客的最后一个例子我还是没有能够正确写出执行结果。因此我又自己写了一个多层修饰器的例子。以下是我对执行过程的理解。

# an example of python decorator
def deco1(func):
    print(1)
    def wrapper1():
        print(2)
        func()
        print(3)
    print(4)
    return wrapper1

def deco2(func):
    print(5)
    def wrapper2():
        print(6)
        func()
        print(7)
    print(8)
    return wrapper2

@deco1
@deco2
def foo():
    print('foo')


if __name__ == '__main__':
    foo()

运行结果:

5
8
1
4
2
6
foo
7
3
  1. 修饰器本质上就是一个函数,只不过它的传入参数同样是一个函数。因此,依次加了deco1deco2两个装饰器的原函数foo实际上相当于deco1(deco2(foo))
  2. 明白了第1步后,下面进入这个复合函数。首先执行的是内层函数deco2(foo)。因此第一个打印值是5。接下来要注意,在deco2这个函数内定义了一个wrapper2函数,但是并没有类似于wrapper2()的语句,因此该函数内的语句并没有立即执行,而是作为了返回值。因此wrapper2内的3条语句作为输入参数传递到了deco1内。wrapper2函数内还有一行print(8),因此第二个打印值为8。
  3. 下一步是执行deco1()函数内容。与2类似,先打印出1和4,返回值为wrapper1。由于更外层没有装饰器,因此接下来就将执行wrapper1内的内容。第五个打印值为2。接着执行func()函数,注意此处func()表示的是wrapper2中的内容,因此跳到wrapper2中执行。第六个打印值为6。类似的,wrapper2中的func()foo(),因此接着会输出foo。最后,回到wrapper2wrapper1的最后一行,依次输出7和3。到这里,整个装饰器的运行过程结束。
  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值