zoukankan      html  css  js  c++  java
  • python多个装饰器的执行顺序

    ef 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
    --------------------- 

  • 相关阅读:
    如何做竞品分析报告
    软件架构入门
    系统内部矛盾的解决思路
    分表分库一
    Hbase随笔2
    Hbase随笔
    vertica在电信的应用
    理解RESTful架构
    百分点刘译璟
    数据产品的简介
  • 原文地址:https://www.cnblogs.com/ly570/p/10983125.html
Copyright © 2011-2022 走看看