Python多个装饰器的顺序 转载

3、使用两个装饰器
当一个装饰器不够用的话,我们就可以用两个装饰器,当然理解起来也就更复杂了,当使用两个装饰器的话,首先将函数与内层装饰器结合然后在与外层装饰器相结合,要理解@语法的时候到底执行了什么,是理解装饰器的关键。这里还是用最简单的例子来进行说明。

 1 def outer2(func2):
 2     def inner2(*args,**kwargs):
 3         print('开始')
 4         r=func2(*args,**kwargs)
 5         print('结束')
 6         return r
 7     return inner2
 8  
 9 def outer1(func1):
10     def inner1(*args,**kwargs):
11         print('start')
12         r=func1(*args,**kwargs)
13         print('end')
14         return r
15     return inner1
16  
17 @outer2                                # 这里相当于执行了 f=outer1(f)  f=outer2(f),步骤如下
18 @outer1                                #1、f=outer1(f) f被重新赋值为outer1(1)的返回值inner1,
19 def f():                               #    此时func1为 f():print('f 函数')
20     print('f 函数')                     #2、f=outer2(f) 类似f=outer2(inner1) f被重新赋值为outer2的返回值inner2
21                                        #    此时func2 为inner1函数 inner1里面func1函数为原来的 f():print('f 函数')
22                                                                           
23 f()                                    # 相当于执行 outer2(inner1)()
24 
25 #执行结果如下:
26 开始                                   # 在outer函数里面执行,首先打印 ‘开始 ’
27 start                                 # 执行func2 即执行inner1函数 打印 ‘start’
28 f 函数                                 # 在inner1函数里面执行 func1 即f()函数,打印 ‘f 函数’
29 end                                   # f函数执行完,接着执行inner1函数里面的 print('end')
30 结束                                   # 最后执行inner2函数里面的 print('结束')

 

python执行代码的时候碰到两个装饰器解释过程:

1、将@outer1和f()先执行:函数outer1()将返回值inner1重新赋值给f,此时f指向的函数体是inner1的函数体,这里称f为新f

2、执行@outer:@outer2将新f当作参数传入inner2(),然后将返回值inner2重新赋值给f,此时f指向的函数体是inner2的函数体

执行过程和解释过程是相反的:从上到下的,先通过第一层@outer2 -----> @outer1 -------> f(),结合执行结果你就很明白了。

posted @ 2017-07-28 12:58  eric_yi  阅读(619)  评论(0编辑  收藏  举报