首頁(yè)技術(shù)文章正文

Python培訓(xùn):什么是裝飾器?

更新時(shí)間:2022-09-30 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  編者之前在知乎上看到一個(gè)很形象的比喻來(lái)描述裝飾器,它是這么說(shuō)的:

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

  讀完上面的句子,不知道大家有沒(méi)有體會(huì)到裝飾器的好處?好了,我們言歸正傳,我們開(kāi)始裝飾器的學(xué)習(xí)吧。

  裝飾器本質(zhì)是一個(gè)Python函數(shù),它可以在不改動(dòng)其他函數(shù)的前提下,對(duì)函數(shù)的功能進(jìn)行擴(kuò)充。通常情況下,裝飾器用于下列場(chǎng)景:

  (1)引入日志;

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

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

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

  (5)權(quán)限校驗(yàn);

  (6)緩存。

  先看一個(gè)簡(jiǎn)單的例子。

def test_one():
    print('test_one')

  現(xiàn)在有一個(gè)需求,希望可以輸出函數(shù)的執(zhí)行日志,這時(shí),有人會(huì)這么實(shí)現(xiàn):

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

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

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

  按照上述代碼將函數(shù)作為參數(shù)傳遞,雖然可以實(shí)現(xiàn)功能,但是卻破壞了原有代碼的邏輯結(jié)構(gòu)。如果要求已經(jīng)實(shí)現(xiàn)的函數(shù),不能修改,只能擴(kuò)展,即遵守“封閉開(kāi)放”原則,那么是不允許在函數(shù)test內(nèi)部進(jìn)行修改的。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!