• 装饰器调用顺序


    先放结论:

    • 装饰顺序按靠近函数顺序执行,执行时由外而内。(即:执行顺序和装饰顺序相反)

     

    话不多说,上俩栗子,就能明白咋回事。

    1.装饰器完成装饰,但并不调用的输出结果

     1 def one(func):
     2     print('----1----')
     3     def two():
     4         print('----2----')
     5         func()
     6     return two
     7 
     8 def a(func):
     9     print('----a----')
    10     def b():
    11         print('----b----')
    12         func()
    13     return b
    14 
    15 @one    # @one相当于demo = one(demo)  装饰时候已经执行一次外部函数了。
    16 @a
    17 def demo():
    18 print('----3----')

     

     2.装饰器完成装饰,调用后的输出结果

    #代码同上,调用装饰器
    
    demo()

     

    3.解释

    装饰顺序按靠近函数顺序执行:@a 靠近原函数,故先装饰它。再装饰@one。

    (因为:@装饰的是它下面的函数,@one下面不是函数,就先装饰@a)

    15 @one  
    16 @a
    17 def demo():
    18     print('----3----')

     

    装饰器的 @ 装饰时候已经执行一次外部函数了:故输出的是上例1的结果。

    (因为: @one相当于demo = one(demo)  会调用一次外部函数)

    而执行时,由外而内:先调用def two( ) ,再调用def b( ),故输出的是上例2的结果。

     

  • 相关阅读:
    Android 对话框(Dialog)
    struts2 开发模式
    Struts2动态方法调用(DMI)
    Struts2中 Path (getContextPath与basePath)
    String path = request.getContextPath
    ios虚拟机安装(二)
    Spring MVC 的 研发之路
    Swift辛格尔顿设计模式(SINGLETON)
    【算法导论】多项式求和
    uva 11181
  • 原文地址:https://www.cnblogs.com/liangmingshen/p/9252002.html
Copyright © 2020-2023  润新知