更新時間:2022-09-30 來源:黑馬程序員 瀏覽量:
編者之前在知乎上看到一個很形象的比喻來描述裝飾器,它是這么說的:
“內(nèi)褲可以用來遮羞,但是到了冬天沒法為我們防風(fēng)御寒,聰明的人發(fā)明了長褲,有了長褲后就不會冷了。裝飾器就像是這里說的長褲,在不影響內(nèi)褲作用的前提之下,給我們的身體提供了保暖的功效?!?/p>
讀完上面的句子,不知道大家有沒有體會到裝飾器的好處?好了,我們言歸正傳,我們開始裝飾器的學(xué)習(xí)吧。
裝飾器本質(zhì)是一個Python函數(shù),它可以在不改動其他函數(shù)的前提下,對函數(shù)的功能進行擴充。通常情況下,裝飾器用于下列場景:
(1)引入日志;
(2)函數(shù)執(zhí)行時間統(tǒng)計;
(3)執(zhí)行函數(shù)前預(yù)備處理;
(4)執(zhí)行函數(shù)后清理功能;
(5)權(quán)限校驗;
(6)緩存。
先看一個簡單的例子。
def test_one(): print('test_one')
現(xiàn)在有一個需求,希望可以輸出函數(shù)的執(zhí)行日志,這時,有人會這么實現(xiàn):
def test_one(): print('test_one') print('test_one is running') test_one()
但是,如果函數(shù)test_two()、函數(shù)test_three()都有類似的需求,那么現(xiàn)在這樣的做法會出現(xiàn)大量重復(fù)代碼。為了減少重復(fù)的代碼,我們可以創(chuàng)建一個新的函數(shù)專門記錄函數(shù)執(zhí)行日志,誰需要記錄執(zhí)行日志,就把誰作為參數(shù)傳遞,示例代碼如下:
def print_log(func): print('函數(shù)正在運行中') func() def test(): print('test') print_log(test)
按照上述代碼將函數(shù)作為參數(shù)傳遞,雖然可以實現(xiàn)功能,但是卻破壞了原有代碼的邏輯結(jié)構(gòu)。如果要求已經(jīng)實現(xiàn)的函數(shù),不能修改,只能擴展,即遵守“封閉開放”原則,那么是不允許在函數(shù)test內(nèi)部進行修改的。