多个装饰器修饰一个函数时的调用顺序

Posted 思辨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个装饰器修饰一个函数时的调用顺序相关的知识,希望对你有一定的参考价值。

参考教程: https://blog.csdn.net/jyhhhhhhh/article/details/54627850

#当有多个装饰器装饰一个函数时,他们的执行顺序

#观察下方的代码就会发现
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):
    #decorator_b(decorator_a(f))
    #而以上代码【decorator_b(decorator_a(f))】返回的是inner_b,所以执行的时候是先执行inner_b
    #然后在执行【decorator_a(f)】返回的inner_a  .最终在调用f(1)的时候,函数inner_b输出‘Get in inner_b‘
    #然后执行inner_a输出Get in decorator_a,最后执行func(),即f
    
    
    #调用时,函数的顺序
    ‘‘‘
    @decorator_b
    @decorator_a
    def f(x)
    
    相当于-------decorator_b(decorator_a(f)),其中每一层返回的都是一个函数对象,没有调用
    之后返回时的函数对象--------inner_b(inner_a)
    然后最后一行当我们对 f 传入参数1进行调用时, inner_b 被调用了,它会先打印 Get in inner_b ,
    然后在 inner_b 内部调用了 inner_a 所以会再打印 Get in inner_a, 然后再 inner_a 内部调用的原来的 f, 
    并且将结果作为最终的返回
    ‘‘‘
    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


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

@login_required
@permision_allowed
def f()
  # Do something

  



以上是关于多个装饰器修饰一个函数时的调用顺序的主要内容,如果未能解决你的问题,请参考以下文章

1.16 Python基础知识 - 装饰器

Python装饰器执行顺序详解

Python多个装饰器的顺序 转载

python 多个装饰器的调用顺序分析

叠加多个装饰器

装饰器