python多个装饰器的执行顺序

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), 执行结果为<function inner_b at 0x00000000038F15F8>可验证。

所以如上所示代码中,最后执行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
总结一下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,如果一个函数使用了多个装饰,那么它们的执行顺序是从下往上的。也就是说,最下面的装饰最先执行,最上面的装饰最后执行,函数执行完后,装饰执行顺序则与装饰定义的顺序相反。 例如,下面是一个使用三个装饰的示例: ``` python def decorator1(func): def wrapper(*args, **kwargs): print("Decorator 1 before function execution") func(*args, **kwargs) print("Decorator 1 after function execution") return wrapper def decorator2(func): def wrapper(*args, **kwargs): print("Decorator 2 before function execution") func(*args, **kwargs) print("Decorator 2 after function execution") return wrapper def decorator3(func): def wrapper(*args, **kwargs): print("Decorator 3 before function execution") func(*args, **kwargs) print("Decorator 3 after function execution") return wrapper @decorator1 @decorator2 @decorator3 def my_function(): print("Function execution") my_function() ``` 输出结果为: ``` Decorator 3 before function execution Decorator 2 before function execution Decorator 1 before function execution Function execution Decorator 1 after function execution Decorator 2 after function execution Decorator 3 after function execution ``` 可以看到,装饰3最先执行,然后是装饰2,最后是装饰1。而函数执行完后,装饰执行顺序则与装饰定义的顺序相反,即装饰1最先执行,然后是装饰2,最后是装饰3。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值