首頁技術文章正文

Python培訓:什么是裝飾器?

更新時間:2022-09-30 來源:黑馬程序員 瀏覽量:

IT培訓班

  編者之前在知乎上看到一個很形象的比喻來描述裝飾器,它是這么說的:

  “內褲可以用來遮羞,但是到了冬天沒法為我們防風御寒,聰明的人發(fā)明了長褲,有了長褲后就不會冷了。裝飾器就像是這里說的長褲,在不影響內褲作用的前提之下,給我們的身體提供了保暖的功效?!?/p>

  讀完上面的句子,不知道大家有沒有體會到裝飾器的好處?好了,我們言歸正傳,我們開始裝飾器的學習吧。

  裝飾器本質是一個Python函數,它可以在不改動其他函數的前提下,對函數的功能進行擴充。通常情況下,裝飾器用于下列場景:

  (1)引入日志;

  (2)函數執(zhí)行時間統(tǒng)計;

  (3)執(zhí)行函數前預備處理;

  (4)執(zhí)行函數后清理功能;

  (5)權限校驗;

  (6)緩存。

  先看一個簡單的例子。

def test_one():
    print('test_one')

  現在有一個需求,希望可以輸出函數的執(zhí)行日志,這時,有人會這么實現:

def test_one():
    print('test_one')
    print('test_one is running')
test_one()

  但是,如果函數test_two()、函數test_three()都有類似的需求,那么現在這樣的做法會出現大量重復代碼。為了減少重復的代碼,我們可以創(chuàng)建一個新的函數專門記錄函數執(zhí)行日志,誰需要記錄執(zhí)行日志,就把誰作為參數傳遞,示例代碼如下:

def print_log(func):
    print('函數正在運行中')
    func()
def test():
    print('test')
print_log(test)

  按照上述代碼將函數作為參數傳遞,雖然可以實現功能,但是卻破壞了原有代碼的邏輯結構。如果要求已經實現的函數,不能修改,只能擴展,即遵守“封閉開放”原則,那么是不允許在函數test內部進行修改的。

分享到:
在線咨詢 我要報名
和我們在線交談!