zoukankan      html  css  js  c++  java
  • 装饰器调用顺序

    先放结论:

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

     

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

    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的结果。

     

  • 相关阅读:
    Effective C++:条款14:在中小企业资源管理copying表现
    Linux在iptables教程基本应用防火墙
    C++内存分配和拷贝构造函数写研究
    Codeforces 479E Riding in a Lift(dp)
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/liangmingshen/p/9252002.html
Copyright © 2011-2022 走看看