zoukankan      html  css  js  c++  java
  • 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(),结合执行结果你就很明白了。

  • 相关阅读:
    [POJ2752]Seek the Name, Seek the Fame
    [HDOJ1247]Hat’s Words
    [POJ2001]Shortest Prefixes
    不用代码,10分钟打造属于自己的第一款小程序
    不用代码,10分钟打造属于自己的第一款小程序
    不用代码,10分钟打造属于自己的第一款小程序
    移动端iPhone系列适配问题的一些坑
    移动端iPhone系列适配问题的一些坑
    【前端统计图】echarts多条折线图和横柱状图实现
    【前端统计图】echarts多条折线图和横柱状图实现
  • 原文地址:https://www.cnblogs.com/eric_yi/p/7249661.html
Copyright © 2011-2022 走看看