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的應用