最近刷知乎的過程中發現了一篇介紹Python裝飾器的文章,寫的很好,順手就把它收藏了.既然進了收藏夾,我也希望能夠把它移出.於是乎有了這麼一篇博客.主要是記錄相關的資料和信息,以及自己的學習過程.
Python裝飾器的理解
什麼是Python裝飾器
顧名思義,它是裝飾Python的工具,使得Python代碼更加簡潔.它也可以說是函數的函數,因爲傳入參數是一個函數,通過實現各種功能來對這個函數的功能進行增強.
有什麼作用
正如上文所說,裝飾器的作用是增強函數的功能.當然,增強函數的功能有多種方式,但是裝飾器有着一個無法替代的優勢–簡潔.
你只需要在每個函數上方加入一個@就可以對其進行增強.
在哪些場景下使用裝飾器
裝飾器最大的優勢是解決重複性操作,主要使用場景有如下幾個:
- 計算函數運行時間
- 給函數打日誌
- 類型檢查
簡單的示例
計算函數運行時間
from time import sleep
from timeit import default_timer as timer
def runtime_deco(func):
def wrapper(): # 需要添加的額外功能在這個函數中實現
tic = timer()
res = func() # 函數在這裏運行
toc = timer()
funcName = func.__name__
print(f'[{funcName}] time cost is {toc - tic}s')
return res
return wrapper
@runtime_deco
def func_1():
sleep(0.1)
return 0.1
@runtime_deco
def func_2():
sleep(0.2)
return 0.2
res1 = func_1()
res2 = func_2()
print(res1, res2)
輸出爲
[func_1] time cost is 0.10013694799999939s
[func_2] time cost is 0.2002391039968643s
0.1 0.2
帶參數的裝飾器
from time import sleep
from timeit import default_timer as timer
def logger_deco(msg='INFO'): # 在此處輸入額外的信息
def runtime(func): # 在該函數增加函數的功能
def wrapper():
tic = timer()
res = func() # 函數在這裏運行
toc = timer()
funcName = func.__name__
print(f'[{msg}] {funcName} time cost is {toc - tic}s')
return res
return wrapper
return runtime
@logger_deco(msg='Info')
def func_1():
sleep(0.1)
return 0.1
@logger_deco(msg='Warning')
def func_2():
sleep(0.2)
return 0.2
res1 = func_1()
res2 = func_2()
print(res1, res2)
輸出爲:
[Info] func_1 time cost is 0.1001392020007188s
[Warning] func_2 time cost is 0.20023673100149608s
0.1 0.2