裝飾器(Decorator)

這個(gè)概念一開始真的很難理解,以至于現(xiàn)在我去寫這篇日志,我都不確定是否真的理解了裝飾器的意義。首先,假定我們定義一個(gè)函數(shù)date()

def date():
    print("2017/9/17")

這個(gè)函數(shù)的作用很簡(jiǎn)單,就是打印日期。但是如果我們現(xiàn)在希望,在正常書寫調(diào)用date()函數(shù)時(shí),它可以申明自己已經(jīng)被調(diào)用(也就是額外加上一個(gè)功能)。
如果不額外強(qiáng)求正常書寫:

def call_me(func):
    print("{} is running").formate(func))
    func()

def date():
    print("2017/9/17")

call_me(date)

以上函數(shù)就可以實(shí)現(xiàn)這個(gè)功能。
但是,有個(gè)問(wèn)題。因?yàn)槲抑皇窍M谖艺{(diào)用date()時(shí),可以附帶上一些功能,而不需要改寫一些代碼。上面的實(shí)現(xiàn)方法,已經(jīng)完全看不到直接調(diào)用date()的影子了。這個(gè)時(shí)候,可以用裝飾器實(shí)現(xiàn):

def call_me(func):
    def wrapper():
        print("{} is running").formate(func))
        return func()
    return wrapper()

def date():
    print("2017/9/17")

date = call_me(date)
date()

這時(shí),我們想使用附帶功能的date()函數(shù),也一樣只需要調(diào)用date(),而不是用call_me(date)。其中call_me()就是一個(gè)裝飾器。簡(jiǎn)單點(diǎn)說(shuō),其實(shí),call_me()是把額外的功能連同date()本身封裝到了一起。call_me()本身返回了一個(gè)函數(shù)wrapper(),語(yǔ)句date = call_me(date)相當(dāng)于是date = wrapper,那么調(diào)用了date()就相當(dāng)于調(diào)用了wrapper(),而wrapper()函數(shù)就是一個(gè)帶有額外功能的date()。
現(xiàn)在最新的實(shí)例看起來(lái)還不夠簡(jiǎn)潔,因?yàn)槲覀兊慕K極目的是,越簡(jiǎn)單越好。這時(shí),就要用到@。新的實(shí)例如下:

def call_me(func):
    def wrapper():
        print("{} is running").formate(func))
        return func()
    return wrapper()

@call_me
def date():
    print("2017/9/17")

date()

這樣就是實(shí)現(xiàn)了我們的最初目的?,F(xiàn)在看起來(lái),call_me就像是裝飾一樣在date()函數(shù)前面。運(yùn)行的結(jié)果是這樣的:

>>>date is running
   2017/9/17

我自己對(duì)裝飾器的理解比較粗略,也就只能闡述于此,紕漏甚多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • python 是一門優(yōu)雅的語(yǔ)言,有些使用方法就像魔法一樣。裝飾器(decorator)就是一種化腐朽性為神奇的技巧...
    人世間閱讀 7,593評(píng)論 6 54
  • 我對(duì)Python裝飾器的理解就是用一個(gè)函數(shù)去修飾另外一個(gè)函數(shù)。 裝飾器 在運(yùn)行原來(lái)功能的基礎(chǔ)上,添加一些新的功能...
    敢夢(mèng)敢當(dāng)閱讀 304評(píng)論 0 1
  • 裝飾器(Decorator)是Python的一個(gè)重要部分。簡(jiǎn)單地說(shuō):它們是修改其它函數(shù)的功能的函數(shù)。 它們有助于讓...
    hufengreborn閱讀 753評(píng)論 0 1
  • 在前面的文章中知道一點(diǎn),變量可以指向函數(shù),所以變量也可以調(diào)用函數(shù) 其實(shí)裝飾器的概念,就是在執(zhí)行函數(shù)外面,再套一個(gè)修...
    布拉豆閱讀 828評(píng)論 1 0
  • 轉(zhuǎn)載:http://www.itdecent.cn/p/1d8bbd0ad522 該轉(zhuǎn)載僅作為個(gè)人學(xué)習(xí)記錄。 下面...
    ALEXIRC閱讀 473評(píng)論 0 1

友情鏈接更多精彩內(nèi)容