5.1 認識裝飾器
裝飾器 是一種函數,可以接收另一個函數作為參數,並返回一個新的函數,改變或擴展原始函數的行為。裝飾器用來提升程式碼的可讀性和重複使用性。
裝飾器允許在不改變函數或方法原始程式碼的情況下修改其行為。因此,它們被廣泛用於添加功能、日誌記錄、訪問控制以及許多其他任務。
Python中的裝飾器語法包括在裝飾器名稱前面使用 符號 @,並將其放在函數定義之前。
@decorator
def my_function():
pass
這等同於以下程式碼:
def my_function():
pass
my_function = decorator(my_function)
仔細想想,這是什麼:我們宣告了一個函數 my_function,但隨後將其替換為函數 decorator,將我們的函數作為參數傳遞進去。函數 decorator 可以根據自己的選擇調用我們的函數。
5.2 創建簡單的裝飾器
來看一個簡單的裝飾器,它會在調用函數前後輸出一條信息。
def my_decorator(func):
def wrapper():
print("調用函數之前")
func()
print("調用函數之後")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
解釋
裝飾器 (my_decorator):這個函數接受函數 func 作為參數並返回一個新函數 wrapper,它調用 func,並在其調用之前和之後添加額外的行為。
具有裝飾器的函數 (say_hello):函數 say_hello 被裝飾器 my_decorator 包裝,這為其調用添加了額外的行為。
輸出:
# 調用函數之前
Hello!
# 調用函數之後
5.3 帶參數的裝飾器
裝飾器可以接收參數,這樣可以靈活地設置其行為。
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
解釋
帶參數的裝飾器 (repeat):這個函數接收參數 num_times 並返回裝飾器 decorator_repeat。
裝飾器 (decorator_repeat):這個裝飾器接收函數 func 並返回一個新函數 wrapper,該函數調用 func num_times次。
具有裝飾器的函數 (say_hello):由於裝飾器 repeat,函數 say_hello 被調用了三次。
輸出:
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION