Python:淺談裝飾器

Python的裝飾器是個(gè)好東西,它能干很多事情羽莺。但對(duì)于新手,它看起來(lái)似乎沒(méi)那么簡(jiǎn)單洞豁。
但事實(shí)上盐固,裝飾器本身也只是個(gè)函數(shù)荒给。

import time
def log(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("The func '{}' used {}s.".format(func.__name__, end-start))
        return result
    return warpper

這一個(gè)裝飾器,當(dāng)我們這樣使用時(shí)

@log
def fuck(name):
    """Fuck someone"""
    print("Fuck", name)

它只是執(zhí)行了fuck = log(fuck)這樣一句代碼而已刁卜。
也就是說(shuō)志电,我們表面上是用fuck("myself"),事實(shí)上執(zhí)行的都是log(fuck)("myself")蛔趴。因?yàn)镻ython里面都是對(duì)象嘛挑辆。
同樣的道理,假設(shè)我們定義了一個(gè)帶參數(shù)的裝飾器logging孝情,它實(shí)際上執(zhí)行的是

func = logging(arguments)(func)

也就是上面那個(gè)不帶參數(shù)的裝飾器多定義一層就行了鱼蝉。

import time
def logging(arguments):
    def log(func):
        def warpper(*args, **kwargs):
            start = time.time()
            result = func(*args, **kwargs)
            end = time.time()
            print("The func '{}' used {}s.".format(func.__name__, end-start))
            return result
        return warpper
    # do something
    return log

但,當(dāng)我們使用一個(gè)裝飾器之后箫荡,它會(huì)將原本的函數(shù)元信息給覆蓋掉魁亦。譬如:函數(shù)名稱,函數(shù)文檔等等羔挡。
例如上例

print(fuck.__name__)
print(fuck.__doc__)

你會(huì)發(fā)現(xiàn)吉挣,函數(shù)信息全部沒(méi)了!fuck它不叫fuck婉弹,改名叫wrapper了睬魂。它的文檔也變成了none
解決辦法很簡(jiǎn)單镀赌,定義裝飾器的時(shí)候用warps裝飾器裝飾接受原函數(shù)參數(shù)的那一層就行了氯哮。
這個(gè)來(lái)自functools模塊的裝飾器能幫你復(fù)制函數(shù)的元信息到被綁定的函數(shù)身上。

修改裝飾器如下(其實(shí)就加了一行代碼hhh)

import time
from functools import wraps
def log(func):
    @wraps(func)
    def warpper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("The func '{}' used {}s.".format(func.__name__, end-start))
        return result
    return warpper

當(dāng)我們?cè)龠\(yùn)行

print(fuck.__name__)
print(fuck.__doc__)

就能看到函數(shù)的的元信息沒(méi)變了商佛。

  • 裝飾器定義時(shí)加@wraps是個(gè)好習(xí)慣喉钢。

一個(gè)較為實(shí)用的裝飾器demo在該專題的另一篇文章:函數(shù)參數(shù)類型檢查

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市良姆,隨后出現(xiàn)的幾起案子肠虽,更是在濱河造成了極大的恐慌,老刑警劉巖玛追,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件税课,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痊剖,警方通過(guò)查閱死者的電腦和手機(jī)韩玩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陆馁,“玉大人找颓,你說(shuō)我怎么就攤上這事《7罚” “怎么了击狮?”我有些...
    開(kāi)封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵佛析,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我彪蓬,道長(zhǎng)说莫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任寞焙,我火速辦了婚禮储狭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捣郊。我一直安慰自己辽狈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布呛牲。 她就那樣靜靜地躺著刮萌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娘扩。 梳的紋絲不亂的頭發(fā)上着茸,一...
    開(kāi)封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音琐旁,去河邊找鬼涮阔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灰殴,可吹牛的內(nèi)容都是我干的敬特。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牺陶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伟阔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掰伸,我...
    開(kāi)封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤皱炉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狮鸭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體合搅,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年怕篷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了历筝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡廊谓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麻削,到底是詐尸還是另有隱情蒸痹,我是刑警寧澤春弥,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站叠荠,受9級(jí)特大地震影響匿沛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榛鼎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一逃呼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧者娱,春花似錦抡笼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至框沟,卻和暖如春藏古,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忍燥。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工拧晕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梅垄。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓防症,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哎甲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔫敲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”,多了一個(gè)“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钐棵怠傩浴?..
    victorsungo閱讀 1,524評(píng)論 0 6
  • Python進(jìn)階框架 希望大家喜歡奈嘿,點(diǎn)贊哦首先感謝廖雪峰老師對(duì)于該課程的講解 一、函數(shù)式編程 1.1 函數(shù)式編程簡(jiǎn)...
    Gaolex閱讀 5,502評(píng)論 6 53
  • 記者:胡知奐 整個(gè)春運(yùn)期間吞加,北京地面公交會(huì)達(dá)到2.94億人次裙犹,為了應(yīng)對(duì)這樣的大客流,北京公交集團(tuán)在北京站衔憨、北京西站...
    視野聚焦閱讀 272評(píng)論 0 1
  • 我曾經(jīng)喜歡過(guò)我的同桌叶圃,我唯一承認(rèn)過(guò)并且不后悔的喜歡過(guò)。 那是我碌碌無(wú)為的青春年華里寥寥可數(shù)的回憶践图,因?yàn)榇蠖鄶?shù)時(shí)間我...
    胡加加閱讀 320評(píng)論 1 2
  • 不行萬(wàn)里掺冠,何以仰泰山
    一任風(fēng)塵閱讀 136評(píng)論 0 0