zoukankan      html  css  js  c++  java
  • 多个装饰器修饰一个函数时的调用顺序

    参考教程: 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
    

      



  • 相关阅读:
    Cordova/Cordova.h file not found的解决方法
    使用MethodSwizzle导致按home app进入后台或者app间切换发生crash的解决方法
    基于iOS上MDM技术相关资料整理及汇总
    iOS集成微信支付
    iOS集成支付宝支付
    最新apple邓白氏码申请地址
    游戏的定价
    许久未更,随便侃侃
    记一个有趣的梦
    由《掟上今日子的备忘录》引发的联想
  • 原文地址:https://www.cnblogs.com/qingsheng/p/9629668.html
Copyright © 2011-2022 走看看