在Python中,裝飾器是一種高級功能,它允許你在不修改函數或類代碼的情況下,為它們添加額外的功能。裝飾器通常用于日志記錄、性能測量、權限檢查等場景。當多個裝飾器應用于同一個函數或類時,它們會形成一個裝飾器鏈(decorator chain)。
裝飾器鏈的工作原理是,每個裝飾器都會返回一個新的函數或類,該函數或類會包裝(或“裝飾”)原始的函數或類。當裝飾器鏈中的多個裝飾器被應用時,它們會依次工作,每個裝飾器都接受前一個裝飾器返回的函數或類作為輸入,并返回一個新的包裝后的函數或類。
下面是一個簡單的示例,展示了如何使用裝飾器鏈:
python復制代碼
def decorator_a(func): | |
def wrapper_a(*args, **kwargs): | |
print("Decorator A is running.") | |
result = func(*args, **kwargs) | |
print("Decorator A is done.") | |
return result | |
return wrapper_a | |
def decorator_b(func): | |
def wrapper_b(*args, **kwargs): | |
print("Decorator B is running.") | |
result = func(*args, **kwargs) | |
print("Decorator B is done.") | |
return result | |
return wrapper_b | |
@decorator_a | |
@decorator_b | |
def my_function(): | |
print("My function is running.") | |
# 當你調用my_function時,實際調用的是decorator_a(decorator_b(my_function)) | |
my_function() |
輸出將會是:
復制代碼
Decorator B is running. | |
My function is running. | |
Decorator B is done. | |
Decorator A is running. | |
Decorator A is done. |
注意輸出的順序。首先,decorator_b
被應用,然后是decorator_a
。但是,由于裝飾器鏈的工作方式,當你調用my_function
時,decorator_a
的包裝函數(wrapper_a
)會首先被調用,然后它調用decorator_b
的包裝函數(wrapper_b
),最后才是原始函數my_function
。
這種順序可能看起來有些反直覺,但它是裝飾器鏈工作的基本原理。每個裝飾器都返回一個新的函數,該函數會調用下一個裝飾器(或原始函數),并可能在其前后添加額外的功能。