天天看點

Python多層裝飾器執行順序

一層裝飾器

# -*- coding: utf-8 -*-


def func1(func):
    print("func1-1")

    def inner1():
        print("inner1-1")
        func()
        print("inner1-2")

    print("func1-2")
    return inner1


@func1
def func():
    print("func")

# 第一步改變函數指向
# 相當于 func1(func) -> inner1

# func1-1
# func1-2

# 腳本執行的時候就動态添加了func 的指向,現在func指向inner1


# 第二步,執行函數,相當于執行内部函數
# func()
# 相當于 func1(func)() -> inner1()

# func1-1
# func1-2

# inner1-1
# func
# inner1-2
      

兩層裝飾器

def func2(func):
    print("func2-1")

    def inner2():
        print("inner2-1")
        func()
        print("inner2-2")

    print("func2-2")
    return inner2


@func2
@func1
def func():
    print("func")


# 相當于
# func2(func1(func))  -> func2(inner1)  -> inner1 + inner2

# func1-1
# func1-2    -> inner1
# func2-1
# func2-2    -> inner2

# 第一步,按照疊放順序下到上逐層添加

func()


# 相當于
# func2(func1(func))()

# func1-1
# func1-2    ->inner1
# func2-1
# func2-2    ->inner2

# inner2-1
# inner1-1    ->inner2
# func
# inner1-2
# inner2-2    ->inner1

# 第二步執行的時候從内向外,逐層執行