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",以此类推。
  • 示例:
def outer(func):
    print("1")

    def inner(*args, **kwargs):
        print("2")
        res = func(*args, **kwargs)
        print("3")
        return res

    print("4")

    return inner


def outer1(func):
    print("5")

    def inner(*args, **kwargs):
        print("6")
        res = func(*args, **kwargs)
        print("7")
        return res

    print("8")

    return inner


@outer1
@outer
def test():
    pass


test()

# 输出:

  1
  4
  5
  8
  6
  2
  3
  7

 

posted @ 2023-07-05 00:08  CJTARRR  阅读(378)  评论(0)    收藏  举报