Python裝飾器的學習

最近刷知乎的過程中發現了一篇介紹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

參考資料

如何更通俗地講解Python的裝飾器? - Jackpop的回答 - 知乎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章