python裝飾器decorator的應用

万笑佛發表於2024-11-13

python中的裝飾器類似於java中的AOP切面程式設計的思想,下面透過demo教大家如何實現

(1)一個最簡單的裝飾器 demo1

#一個最簡單的裝飾器
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

結果:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

(2)裝飾器中如何傳遞函式中的引數 demo2

#裝飾器中如何傳遞函式中的引數
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

結果:

Something is happening before the function is called.
Hello, Alice!
Something is happening after the function is called.

(3)多個裝飾器 demo3

#多個裝飾器
def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1")
        return func(*args, **kwargs)
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2")
        return func(*args, **kwargs)
    return wrapper

@decorator1
@decorator2
def say_hi():
    print("Hi!")

say_hi()

結果:

Decorator 1
Decorator 2
Hi!

(4)當作註解,使用 @裝飾器名(裝飾器引數) 繫結到函式上 demo4

#conding=utf-8

#給裝飾器 傳遞引數

def decorator(arg_1, arg_2):
    """
    裝飾器是一個自定義函式,可以接收我們指定的引數,
    其內部內嵌了兩層函式,用於接收函式本身和函式引數.
    因此我們有兩種使用裝飾器的方法:(該樣例使用第一種)
    ① 當作註解,使用 @裝飾器名(裝飾器引數) 繫結到函式上
    ② 當作函式,使用 裝飾器名(裝飾器引數)(函式名)(函式引數) 來一次性呼叫
    我們在裝飾器內部拿到了函式和其引數,因此有較大的自由度可以決定如何呼叫目標函式。
    """
    def wrapper(func):
        def func_wrapper(*args, **kw):

            print(func.__name__)
            print(f"裝飾器引數1: {arg_1}, 裝飾器引數2: {arg_2}")
            print("執行函式前做點什麼")

            result = func(*args, **kw)


            print("執行函式後做點什麼")
            print(f"目標函式執行返回值:{result}")
            return result

        return func_wrapper

    return wrapper


# 加法函式
@decorator("引數1", "引數2")
def add(arg_1: int, arg_2: int):
    print(f"目標函式開始執行, 函式引數為: {arg_1},{arg_2}")
    return arg_1 + arg_2



if __name__ == '__main__':
    print("=" * 10)
    # 繫結註解形式呼叫
    add(3, 5)

結果:

==========
add
裝飾器引數1: 引數1, 裝飾器引數2: 引數2
執行函式前做點什麼
目標函式開始執行, 函式引數為: 3,5
執行函式後做點什麼
目標函式執行返回值:8

(5)當作函式,使用 裝飾器名(裝飾器引數)(函式名)(函式引數) 來一次性呼叫 demo5

#conding=utf-8

#給裝飾器 傳遞引數

def decorator(arg_1, arg_2):
    """
    建立裝飾器。
    裝飾器是一個自定義函式,可以接收我們指定的引數,
    其內部內嵌了兩層函式,用於接收函式本身和函式引數.
    因此我們有兩種使用裝飾器的方法:(該樣例使用第二種)
    ① 當作註解,使用 @裝飾器名(裝飾器引數)  繫結到函式上
    ② 當作函式,使用 裝飾器名(裝飾器引數)(函式名)(函式引數) 來一次性呼叫
    我們在裝飾器內部拿到了函式和其引數,因此有較大的自由度可以決定如何呼叫目標函式。
    """
    def wrapper(func):
        def func_wrapper(*args, **kw):

            print(func.__name__)
            print(f"裝飾器引數1: {arg_1}, 裝飾器引數2: {arg_2}")
            print("執行函式前做點什麼")

            result = func(*args, **kw)


            print("執行函式後做點什麼")
            print(f"目標函式執行返回值:{result}")
            return result

        return func_wrapper

    return wrapper


# 加法函式
@decorator("引數1", "引數2")
def add(arg_1: int, arg_2: int):
    print(f"目標函式開始執行, 函式引數為: {arg_1},{arg_2}")
    return arg_1 + arg_2



if __name__ == '__main__':
    print("=" * 10)
    # 繫結註解形式呼叫
    # 一次性呼叫
    decorator("引數_1", "引數_2")(add)(3,5)

結果:

==========
func_wrapper
裝飾器引數1: 引數_1, 裝飾器引數2: 引數_2
執行函式前做點什麼
add
裝飾器引數1: 引數1, 裝飾器引數2: 引數2
執行函式前做點什麼
目標函式開始執行, 函式引數為: 3,5
執行函式後做點什麼
目標函式執行返回值:8
執行函式後做點什麼
目標函式執行返回值:8

(6)類裝飾器 demo6

#conding=utf-8

#類裝飾器
class MyDecorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("Something is happening before the function is called.")
        result = self.func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result

@MyDecorator
def say_goodbye():
    print("Goodbye!")

say_goodbye()

結果:

Something is happening before the function is called.
Goodbye!
Something is happening after the function is called.

原始碼獲取方式(免費):
(1)登入-註冊:http://resources.kittytiger.cn/
(2)搜尋:python裝飾器decorator的應用

相關文章