Python裝飾器——初識

上次講了Python的閉包效诅,今天來講一下閉包的應用——裝飾器

1. 裝飾器是什么

什么叫裝飾器?顧名思義离陶,它是一個用來裝飾的東西。用來裝飾誰呢衅檀?用來裝飾函數(shù)招刨。由于裝飾器器自身也是一個函數(shù),所以哀军,一句話來說沉眶,裝飾器是一個用來裝飾函數(shù)的函數(shù)。感覺有點拗口杉适,那么沦寂,在我的理解,裝飾器只是個輔助函數(shù)淘衙,有沒有它并不影響被裝飾函數(shù)的運行传藏。下面聽我娓娓道來。

2.函數(shù)的表達

在講之前彤守,我們先來看一下函數(shù)毯侦,有這樣一個函數(shù):

def func():
    print "running func"

我們都知道,運行func()將會輸出:

>> running func

然而具垫,運行func侈离,則輸出:

>> <function func at 0x7f70236215f0>

所以我們看到在函數(shù)名之后加了括號會進入函數(shù)內(nèi)部運行,而不加括號只是代表了一個函數(shù)對象(Python中一切皆對象筝蚕,函數(shù)也是)卦碾,記住這點可以幫我們更好的理解裝飾器。

3.場景

現(xiàn)在我有一堆函數(shù)例如:

def func1():
    print "running func1"

def func2():
    print "running func2"

def func3():
    print "running func3"

不過現(xiàn)在起宽,為了證明這些函數(shù)是我寫的洲胖,都要打印一句話。那么坯沪,我可能會這樣寫:

def func1():
    print "running func1"
    print "強哥好帥绿映!"

其他函數(shù)也是如此。然而,到以后函數(shù)多了的時候叉弦,你會感覺這樣寫很是麻煩丐一,而且還更改了原函數(shù)的業(yè)務邏輯,非常不好淹冰。這時候库车,便可以用閉包來實現(xiàn)。

4.用閉包簡化

改成閉包的形式如下:

#把此函數(shù)寫在最上面樱拴,因為`Python`解釋器自上而下解釋
def shoe_me(func):
    def wrapper():
        print "強哥好帥柠衍!"
        func()
    return wrapper

#原函數(shù)
def func1():
    print "running func1"

func1 = show_me(func1)

if __name__ == '__main__':
    func1()

運行后的結果如圖:

閉包實現(xiàn)

注意:當程序運行到func1 = show_me(func1)時并沒有立即執(zhí)行函數(shù),只是定義了一個新函數(shù)疹鳄。show_me(func1)其實等價于如下:

def wrapper():
    print "強哥好帥拧略!"
    func1()

所以芦岂,只有當func1()時瘪弓,才真正運行。這正好對應了第二部分中函數(shù)執(zhí)行的原理禽最。

5.用裝飾器進一步簡化

以上需求的實現(xiàn)還是有一點繁瑣腺怯,Python大發(fā)給我們提供了@語法糖,來看一下怎么使用:

@shoe_me
def func2():
    print "running func2"

運行程序func2(),輸出如下圖:

裝飾器實現(xiàn)

如程序所示川无,@shoe_me和原來閉包實現(xiàn)func2 = show_me(func2)是完全等價的呛占,這樣便能在不改變原函數(shù)的情況下添加裝飾,增加功能懦趋。

顯然晾虑,上面的例子除了裝B,確實沒有其他功能仅叫。那裝飾器到底有什么實際功能呢帜篇?如函數(shù)日志分析(對上面的裝飾器改進),登陸訪問(Django中的@login_required)诫咱,權限驗證笙隙,緩存設置,記數(shù)器等坎缭,下一節(jié)將繼續(xù)介紹裝飾器的高級用法竟痰。

6.后記

略啰嗦,最后一部分才引入裝飾器掏呼。坏快。。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憎夷,一起剝皮案震驚了整個濱河市假消,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岭接,老刑警劉巖富拗,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼予,死亡現(xiàn)場離奇詭異,居然都是意外死亡啃沪,警方通過查閱死者的電腦和手機粘拾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來创千,“玉大人缰雇,你說我怎么就攤上這事∽仿浚” “怎么了械哟?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長殿雪。 經(jīng)常有香客問我暇咆,道長,這世上最難降的妖魔是什么丙曙? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任爸业,我火速辦了婚禮,結果婚禮上亏镰,老公的妹妹穿的比我還像新娘扯旷。我一直安慰自己,他們只是感情好索抓,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布钧忽。 她就那樣靜靜地躺著,像睡著了一般逼肯。 火紅的嫁衣襯著肌膚如雪耸黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天汉矿,我揣著相機與錄音崎坊,去河邊找鬼。 笑死洲拇,一個胖子當著我的面吹牛奈揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赋续,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼男翰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纽乱?” 一聲冷哼從身側響起蛾绎,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后租冠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹏倘,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡编丘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年旋圆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔呀。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡镜粤,死狀恐怖捏题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肉渴,我是刑警寧澤公荧,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站同规,受9級特大地震影響循狰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捻浦,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一晤揣、第九天 我趴在偏房一處隱蔽的房頂上張望桥爽。 院中可真熱鬧朱灿,春花似錦、人聲如沸钠四。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缀去。三九已至侣灶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缕碎,已是汗流浹背褥影。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咏雌,地道東北人凡怎。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像赊抖,于是被迫代替她去往敵國和親统倒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • 我對Python裝飾器的理解就是用一個函數(shù)去修飾另外一個函數(shù)氛雪。 裝飾器 在運行原來功能的基礎上房匆,添加一些新的功能...
    敢夢敢當閱讀 266評論 0 1
  • 呵呵!作為一名教python的老師,我發(fā)現(xiàn)學生們基本上一開始很難搞定python的裝飾器浴鸿,也許因為裝飾器確實很難懂...
    TypingQuietly閱讀 19,559評論 26 186
  • 本文為《爬著學Python》系列第四篇文章井氢。從本篇開始,本專欄在順序更新的基礎上岳链,會有不規(guī)則的更新毙沾。 在Pytho...
    SyPy閱讀 2,505評論 4 11
  • 陳舊的木質(zhì)桌子已掉了漆 發(fā)霉的食物沉默呻吟著 擺用多年的家電早就罷工不干 剩余的幾塊破布也成了珍寶 貧窮是何其卑劣...
    楚淺黛閱讀 276評論 13 7