裝飾器

Python SELF TW
等級 14 , 課堂 1
開放

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!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION