上一篇介紹了python的函式,本文將介紹
Python的裝飾器,裝飾器應用非常廣泛,一定要好好掌握啊

什么是裝飾器
裝飾器是一種Python語言的特性,它允許在不修改已有函式的情況下,向函式添加額外的功能,裝飾器本質上是一個函式,它接受一個函式作為引數,并回傳一個新的函式,
裝飾器應用場景
- 記錄函式的執行時間
- 快取函式的結果,以避免重復計算
- 檢查函式的引數是否合法
- 為函式添加日志記錄
- 為函式添加事務處理
- 為函式添加權限檢查
簡單的裝飾器
以下是一個簡單的裝飾器的示例,它向函式添加了計時功能:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("Time elapsed: ", end_time - start_time)
return result
return wrapper
@timer
def my_function():
time.sleep(2)
my_function()
在上面的示例中,timer是裝飾器函式的名稱,它接受一個函式作為引數,并回傳一個新的函式wrapper,wrapper函式計算函式執行的時間,并列印出來,@timer語法將my_function函式傳遞給timer裝飾器,這意味著my_function函式將被timer裝飾器包裝,
當my_function函式被呼叫時,它實際上是wrapper函式被呼叫,wrapper函式計算函式執行的時間,并列印出來,最后,wrapper函式回傳my_function函式的結果,
這將列印Time elapsed: 2.000000238418579到控制臺上,
帶引數的裝飾器
裝飾器可以接受引數,以便在運行時自定義裝飾器的行為,要創建帶引數的裝飾器,需要撰寫一個函式,該函式接受裝飾器引數,并回傳一個裝飾器函式,
以下是一個帶引數的裝飾器的示例,它允許指定函式的重試次數:
import time
def retry(max_retries):
def decorator(func):
def wrapper(*args, **kwargs):
for i in range(max_retries):
try:
result = func(*args, **kwargs)
return result
except Exception as e:
print("Error:", e)
time.sleep(1)
raise Exception("Max retries exceeded")
return wrapper
return decorator
@retry(max_retries=3)
def my_function():
print("Trying...")
raise Exception("Something went wrong")
my_function()
在上面的示例中,retry是帶引數的裝飾器函式的名稱,它接受一個引數max_retries,并回傳一個裝飾器函式decorator,decorator函式接受一個函式作為引數,并回傳一個新的函式wrapper,wrapper函式嘗試呼叫原始函式,如果發生例外,則等待1秒鐘并重試,最多重試max_retries次,
@retry(max_retries=3)語法將my_function函式傳遞給retry裝飾器,并指定max_retries引數為3,
當my_function函式被呼叫時,它實際上是wrapper函式被呼叫,wrapper函式嘗試呼叫原始函式,如果發生例外,則等待1秒鐘并重試,最多重試3次,
這將列印以下內容到控制臺上:
Trying...
Error: Something
@wraps()語法糖
@wraps()是一個裝飾器,它用于將被裝飾函式的元資料復制到裝飾器函式中,這包括函式名稱、檔案字串、引數串列等,使用@wraps()裝飾器可以確保裝飾器函式的元資料與原始函式的元資料相同,這對于除錯和檔案撰寫非常有用,
這個裝飾器丟失了原來函式物件的一些屬性,比如:__name__,__doc__等屬性,使用wraps語法糖可以保留這些屬性,
以下是一個使用@wraps()裝飾器的示例:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("Before function")
result = func(*args, **kwargs)
print("After function")
return result
return wrapper
@my_decorator
def my_function():
print("Function called")
print(my_function.__name__)
總結
裝飾器可以接受引數,以便在運行時自定義裝飾器的行為,要創建帶引數的裝飾器,需要撰寫一個函式,該函式接受裝飾器引數,并回傳一個裝飾器函式,
本文由mdnice多平臺發布
本文來自博客園,作者:北根娃,轉載請注明原文鏈接:https://www.cnblogs.com/alanlin/p/17254100.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548507.html
標籤:Python
上一篇:架構的演進
下一篇:【manim影片教程】-- 安裝
