python两个装饰器执行顺序_python多个装饰器的执行顺序

本文详细探讨了Python装饰器的执行顺序,通过实例代码解释了装饰器如何包装函数并影响执行流程。当有两个或多个装饰器时,它们遵循从下到上装饰,从上到下执行的规则。在实际应用中,如@login_required和@permission_allowed,应按照从具体到通用的顺序进行装饰。
摘要由CSDN通过智能技术生成

def decorator_a(func):

print 'Get in decorator_a'

def inner_a(*args, **kwargs):

print 'Get in inner_a'

return func(*args, **kwargs)

return inner_a

def decorator_b(func):

print 'Get in decorator_b'

def inner_b(*args, **kwargs):

print 'Get in inner_b'

return func(*args, **kwargs)

return inner_b

@decorator_b

@decorator_a

def f(x):

print 'Get in f'

return x * 2

f(1)

执行如上所示代码,最后的执行结果为:

Get in decorator_a

Get in decorator_b

Get in inner_b

Get in inner_a

Get in f

我们来分析下,为什么会是这样的顺序(验证的过程中可以通过打断点的方式来观察函数的程序的执行流程)。

首先:

1、装饰器函数在被装饰函数定义好后立即执行。

我们把代码最后一行注掉:

# f(1)

重新执行,会发现最后执行结果为:

Get in decorator_a

Get in decorator_b

说明装饰器函数在被装饰函数定义好后就立即执行。而且执行顺序是由下到上开始装饰。调用decorator_a时,f被装饰成inner_a,调用decorator_b时,f被装饰成inner_b。

通过在最后执行:print(f), 执行结果为可验证。

所以如上所示代码中,最后执行f(1)时,f已经变成了inner_b,而inner_b中return的func,实则为inner_a, inner_a中return的func才是最终的f。

所以最后的调用顺序为

inner_b --->inner_a--->f

执行结果为:

Get in inner_b

Get in inner_a

Get in f

在实际应用的场景中,当我们采用上面的方式写了两个装饰方法比如先验证有没有登录 @login_required , 再验证权限够不够时 @permision_allowed 时,我们采用下面的顺序来装饰函数:

@login_required

@permision_allowed

def f()

# Do something

return

总结一下:

多个装饰器装饰函数时,有个规律是从小到上包裹(装饰)函数,从上到下执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值