裝飾器(Decorator)是Python中一種強大的工具,它允許我們在不修改原函數代碼的情況下,動態地擴展函數的功能。裝飾器本質上是一個高階函數,它接受一個函數作為參數,并返回一個新的函數。本文將詳細介紹Python裝飾器的使用方法。
裝飾器的核心思想是將一個函數“包裝”在另一個函數中,從而在不改變原函數的情況下,增加額外的功能。裝飾器通常用于日志記錄、性能測試、權限校驗等場景。
下面是一個簡單的裝飾器示例,它在函數執行前后打印日志:
def my_decorator(func):
def wrapper():
print("函數執行前")
func()
print("函數執行后")
return wrapper
@my_decorator
def say_hello():
print("Hello, World!")
say_hello()
輸出結果:
函數執行前
Hello, World!
函數執行后
在這個例子中,my_decorator
是一個裝飾器函數,它接受一個函數 func
作為參數,并返回一個新的函數 wrapper
。@my_decorator
語法糖將 say_hello
函數傳遞給 my_decorator
,并將返回的 wrapper
函數賦值給 say_hello
。
如果被裝飾的函數帶有參數,我們需要在裝飾器的 wrapper
函數中處理這些參數。下面是一個帶參數的裝飾器示例:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("函數執行前")
result = func(*args, **kwargs)
print("函數執行后")
return result
return wrapper
@my_decorator
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
輸出結果:
函數執行前
Hello, Alice!
函數執行后
在這個例子中,wrapper
函數使用了 *args
和 **kwargs
來接受任意數量的位置參數和關鍵字參數,并將它們傳遞給原函數 func
。
裝飾器可以嵌套使用,即一個函數可以被多個裝飾器裝飾。裝飾器的執行順序是從下往上,即最靠近函數的裝飾器最先執行。
def decorator1(func):
def wrapper():
print("Decorator 1 執行前")
func()
print("Decorator 1 執行后")
return wrapper
def decorator2(func):
def wrapper():
print("Decorator 2 執行前")
func()
print("Decorator 2 執行后")
return wrapper
@decorator1
@decorator2
def say_hello():
print("Hello, World!")
say_hello()
輸出結果:
Decorator 1 執行前
Decorator 2 執行前
Hello, World!
Decorator 2 執行后
Decorator 1 執行后
在這個例子中,say_hello
函數被 decorator2
和 decorator1
兩個裝飾器裝飾。執行順序是先執行 decorator2
,再執行 decorator1
。
有時候我們需要裝飾器本身也接受參數,這時可以使用一個“裝飾器工廠”來生成裝飾器。下面是一個帶參數的裝飾器示例:
def repeat(num_times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(num_times=3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
輸出結果:
Hello, Alice!
Hello, Alice!
Hello, Alice!
在這個例子中,repeat
是一個裝飾器工廠,它接受一個參數 num_times
,并返回一個裝飾器 decorator
。decorator
裝飾了 greet
函數,使其重復執行 num_times
次。
除了函數裝飾器,Python還支持類裝飾器。類裝飾器通過實現 __call__
方法來裝飾函數。
class MyDecorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("函數執行前")
result = self.func(*args, **kwargs)
print("函數執行后")
return result
@MyDecorator
def say_hello():
print("Hello, World!")
say_hello()
輸出結果:
函數執行前
Hello, World!
函數執行后
在這個例子中,MyDecorator
是一個類裝飾器,它通過 __call__
方法來實現裝飾功能。
裝飾器是Python中非常強大的工具,它允許我們在不修改原函數代碼的情況下,動態地擴展函數的功能。通過本文的介紹,你應該已經掌握了裝飾器的基本用法、帶參數的裝飾器、裝飾器的嵌套以及類裝飾器的使用。在實際開發中,裝飾器可以大大簡化代碼,提高代碼的可讀性和可維護性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。