先放结论:
- 装饰顺序按靠近函数顺序执行,执行时由外而内。(即:执行顺序和装饰顺序相反)
话不多说,上俩栗子,就能明白咋回事。
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的结果。