Python裝飾器

裝飾器是Python中一種特殊的語(yǔ)法結(jié)構(gòu)物遇,它允許程序員在不修改被裝飾對(duì)象源代碼的情況下期升,通過(guò)在函數(shù)或類定義前加上“@裝飾器函數(shù)”的形式來(lái)動(dòng)態(tài)地?cái)U(kuò)展或修改原始行為镊尺,使得代碼復(fù)用和可維護(hù)性更好寸莫。

裝飾器本質(zhì)是一個(gè)閉包函數(shù)悲立,所以在講解裝飾器之前鹿寨,需要先理解Python閉包函數(shù)的概念,閉包函數(shù)有以下幾個(gè)特點(diǎn):

  • 閉包函數(shù)是函數(shù)的嵌套薪夕,函數(shù)內(nèi)還有函數(shù)脚草,即外層函數(shù)嵌套一個(gè)內(nèi)層函數(shù)。
  • 在外層函數(shù)定義局部變量寥殖,在內(nèi)層函數(shù)通過(guò)nonlocal引用玩讳,并實(shí)現(xiàn)指定功能。

裝飾器-記錄函數(shù)運(yùn)行時(shí)間:

import time

def time_func(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(func.__name__ + "\n" + f"{end - start:0.4f}")
        return result
    return wrapper

@time_func
def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)

print(fib(30))

在這個(gè)例子中嚼贡,我們定義了一個(gè)計(jì)時(shí)器裝飾器函數(shù)time_func熏纯,它接收一個(gè)函數(shù)作為參數(shù),并返回一個(gè)新的函數(shù)wrapper粤策。wrapper函數(shù)包含了原始函數(shù)fib的所有參數(shù)(使用args和*kwargs)樟澜,并在執(zhí)行原始函數(shù)之前記錄起始時(shí)間,在執(zhí)行結(jié)束后打印運(yùn)行時(shí)間叮盘。

使用裝飾器語(yǔ)法糖@time_func修飾fib函數(shù)秩贰,可以自動(dòng)將fib傳遞給time_func函數(shù),將fib函數(shù)修改為wrapper函數(shù)柔吼,并返回修改后的wrapper函數(shù)毒费。最后我們調(diào)用fib(30)來(lái)測(cè)試程序的運(yùn)行時(shí)間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愈魏,一起剝皮案震驚了整個(gè)濱河市觅玻,隨后出現(xiàn)的幾起案子想际,更是在濱河造成了極大的恐慌,老刑警劉巖溪厘,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胡本,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畸悬,警方通過(guò)查閱死者的電腦和手機(jī)侧甫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹋宦,“玉大人披粟,你說(shuō)我怎么就攤上這事∽钡担” “怎么了僻爽?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贾惦。 經(jīng)常有香客問(wèn)我胸梆,道長(zhǎng),這世上最難降的妖魔是什么须板? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任碰镜,我火速辦了婚禮,結(jié)果婚禮上习瑰,老公的妹妹穿的比我還像新娘绪颖。我一直安慰自己,他們只是感情好甜奄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布柠横。 她就那樣靜靜地躺著,像睡著了一般课兄。 火紅的嫁衣襯著肌膚如雪牍氛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天烟阐,我揣著相機(jī)與錄音搬俊,去河邊找鬼。 笑死蜒茄,一個(gè)胖子當(dāng)著我的面吹牛唉擂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檀葛,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玩祟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了屿聋?” 一聲冷哼從身側(cè)響起卵凑,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庆聘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勺卢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡象对,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年黑忱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勒魔。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甫煞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冠绢,到底是詐尸還是另有隱情抚吠,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布弟胀,位于F島的核電站楷力,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏孵户。R本人自食惡果不足惜萧朝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夏哭。 院中可真熱鬧检柬,春花似錦、人聲如沸竖配。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)进胯。三九已至用爪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間龄减,已是汗流浹背项钮。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留希停,地道東北人烁巫。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宠能,于是被迫代替她去往敵國(guó)和親亚隙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 部分細(xì)節(jié)自己改了點(diǎn)违崇,也加了點(diǎn)自己例子阿弃,基本上屬于轉(zhuǎn)載诊霹。轉(zhuǎn)載出處:https://my.oschina.net/le...
    洛克黃瓜閱讀 1,976評(píng)論 0 3
  • 在學(xué)習(xí)Python的過(guò)程中,我相信有很多人和我一樣渣淳,對(duì)Python的裝飾器一直覺得很困惑脾还,我也是困惑了好久,并通過(guò)...
    愚灬墨閱讀 460評(píng)論 1 1
  • 一入愧、什么是裝飾器 裝飾器本質(zhì)上是一個(gè)Python函數(shù)鄙漏,它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外...
    阿飛666666閱讀 439評(píng)論 0 2
  • www.yunxcloud.cn 首先要明白裝飾器是用來(lái)給函數(shù)增加額外功能的。 常用的工具函數(shù) import ti...
    彩色系閱讀 1,019評(píng)論 0 1
  • 裝飾器作為Python當(dāng)中非常經(jīng)典和實(shí)用的feature棺蛛,在項(xiàng)目當(dāng)中應(yīng)用是非常廣泛的怔蚌,比如說(shuō)記錄運(yùn)行時(shí)間,緩存旁赊,鑒...
    Litt1eQ閱讀 124評(píng)論 0 1