python多装饰器的执行顺序

 

  • 装饰器实现

    def outer(func):
       """
      自定义逻辑1
      """
       def inner(*args,**kwargs):
           """
          自定义逻辑2
          """
           res = func(*args,**kwargs)
           """
          自定义逻辑3
          """
           return res
       return inner
  • 装饰器装饰原理

    @outer
    def func():
       pass

    等价于

    func = outer(func)

    """
    通过上述的等价关系,可以知道,装饰器装饰func之后,此时的func就是未被执行的inner方法。
    """
  • 多个装饰器执行顺序

    当func有多个装饰器时,装饰器会按照从下到上的顺序对func进行装饰,也就是最靠近函数的装饰器最先应用装饰,应用装饰的时候会执行装饰器的"自定义逻辑1"。
    最下层装饰器装饰func并返回自己的inner方法,那么上一层的装饰器就会装饰下层装饰器的inner方法,并返回自己的inner方法,以此类推。

    # 从下到上给装饰器编号1~n
    func = outer_n(
      outer_n-1(
          outer_n-2(
              ...(
                  outer_1(func)
                      )
                  )
      )
    )

    此时func指向的就是最上层装饰器的inner方法。
    所以当func被执行时,最先被执行的逻辑是最上层装饰器的"自定义逻辑2",然后是下一层装饰器的"自定义逻辑2",以此类推。
    直到执行完原始的func之后,开始执行最下层装饰器的"自定义逻辑3",然后是上一层装饰器的"自定义逻辑3",以此类推。
posted on 2023-07-05 00:08  CJTARRR  阅读(179)  评论(0编辑  收藏  举报