Fork me on GitHub

装饰器调用顺序

先放结论:

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

 

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

 

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

 

 

posted @ 2018-07-02 01:10  暮良文王  阅读(1329)  评论(0编辑  收藏  举报