python 裝飾器 跟閉包

使用python差不多已經(jīng)有一年多了,回頭來看.自己有很多地方?jīng)]有理解,一直拖著直到現(xiàn)在.其中python中的裝飾器跟閉包.這倆個(gè)概念就是如此.
今天是2018.06.20號(hào)周三,小目標(biāo)是周五晚上24:00之前將本篇的博文整理出來.(失敗周四到周日墮落了四天,尤其是周末),
不探討別的就是把自己對(duì)于裝飾器跟閉包的理解寫下來.
其中探討一下以下幾個(gè)話題:

  • 什么是閉包?
  • 什么是裝飾器?
  • 它們之間有什么聯(lián)系?
  • python 是如何計(jì)算裝飾器方法的锯玛?
  • 閉包存在的原因和工作問題妓羊?

什么是閉包?

閉包指的是延伸了作用域的函數(shù),其中包含函數(shù)定義體中引用,但是不在定義體中定義的非全局變量.函數(shù)是不是匿名的沒有關(guān)系,關(guān)鍵是它能訪問定義體之外定義的非全局變量.


閉包

這里面有以下幾點(diǎn)需要認(rèn)清楚一下:

a = make_averager()
a(10) -----> 10
a(11) ----->10.5
a(12) ----->11
  • 實(shí)例化 make_averager(),你在運(yùn)行的其實(shí)會(huì)調(diào)用里面的averager()函數(shù). series是一個(gè)可變對(duì)象,在averager()之外,調(diào)用 averager()時(shí)它訪問了在它本身定義的非全局變量series.但是如果series是一個(gè)不可變對(duì)象則會(huì)出錯(cuò),函數(shù)averager會(huì)將它變成一個(gè)局部變量,并且報(bào)錯(cuò).

裝飾器(decorate)

關(guān)于裝飾器的小問題.
  • 什么是裝飾器史翘?
    裝飾器僅僅是這樣的函數(shù):(通常)接受被裝飾的可調(diào)用函數(shù)作為唯一參數(shù),并返回一個(gè)可點(diǎn)用函數(shù).
    當(dāng)裝飾器應(yīng)用到裝飾函數(shù)時(shí)(而不是調(diào)用裝飾器時(shí)),會(huì)執(zhí)行裝飾器代碼本身
  • 裝飾器的功能是什么?
  • 裝飾器的的順序锨侯。
    裝飾器的應(yīng)用是自底向上
  • 裝飾器的本質(zhì)临燃。
  • 何處使用裝飾器橱乱?
    如果使用一個(gè)類上的方法不需要這個(gè)這個(gè)類的實(shí)例办成,可以使用@classmethod 或者是@staticmethod裝飾器。
  • 編寫裝飾器的理由
    裝飾器提供了一種絕妙的方式來告知,"在指定的位置,我想要這個(gè)指定的可重復(fù)使用的功能片段"
  • 編寫裝飾器的時(shí)機(jī).
    • 數(shù)據(jù)的清理或添加
      裝飾器可以清理傳遞給被裝飾器函數(shù)的參數(shù)的值.
      裝飾器可以改變或清除從函數(shù)中返回的數(shù)據(jù).
    • 函數(shù)的注冊(cè).
編寫裝飾器
執(zhí)行時(shí)封裝代碼

這種裝飾器非常簡(jiǎn)單,因?yàn)楸谎b飾函數(shù)實(shí)在未經(jīng)修改的條件下傳遞的.但是,執(zhí)行被裝飾方法時(shí),可能希望運(yùn)行額外的功能.為此,可以返回一個(gè)添加合適功能切在執(zhí)行過程中調(diào)用被裝飾方法的可調(diào)用函數(shù).


一個(gè)簡(jiǎn)單的類型檢查

def requires_ints(deocrated):
    def inner(*args, **kwargs):
        kwargs_values = [i for i in kwargs.values()]
        for arg in list(args) + kwargs_values:
            if not isinstance(arg, int):
                raise TypeError('{} only accepts interges as arguments'.format(deocrated.__name__))
        return deocrated(*args, **kwargs)

    return inner

裝飾器自身是requires_ints.它接受一個(gè)參數(shù):decorated,即被裝飾的可調(diào)用函數(shù). 在這里裝飾器唯一做的事情就是返回一個(gè)新的可調(diào)用的函數(shù),即本地函數(shù)inner.該函數(shù)代替了被裝飾方法.

@requires_ints
def foo(x, y):
    """Return the sum of x and y."""
    return x + y

運(yùn)行help(foo)
Help on function inner in module __main__:

inner(*args, **kwargs)

將名稱foo賦給inner函數(shù),而不是賦給原來被定義的函數(shù).

如果運(yùn)行foo(3,5).

  • 首先用傳入的這個(gè)兩個(gè)參數(shù)運(yùn)行inner函數(shù).
  • inner函數(shù)執(zhí)行類型檢查.
  • 然后運(yùn)行被裝飾的方法
  • 簡(jiǎn)單的來說運(yùn)行順序?yàn)?
    • 裝飾器在調(diào)用那一瞬間便已經(jīng)運(yùn)行了起來.在這里 foo函數(shù)經(jīng)過requires_ints裝飾器,已經(jīng)變?yōu)?code>inner函數(shù).(裝飾器唯一做的事情就是返回一個(gè)新的可調(diào)用的函數(shù))
    • foo(3,5)==>inner(3,5) 來驗(yàn)證傳入的變量是否為integers
    • 驗(yàn)證完成之返回foo(3,5)8,完成整個(gè)過程

保存幫助信息
裝飾器時(shí)用于添加通用和可重復(fù)使用功能的工具,相對(duì)模糊的注釋是有必要的,如果使用函數(shù)的人相對(duì)函數(shù)執(zhí)行help,那么他只希望了解函數(shù)的核心信息,而不是關(guān)于shell的信息.

@functools.wraps的裝飾器將一個(gè)函數(shù)中的重要內(nèi)部元素復(fù)制到另一個(gè)函數(shù).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末官疲,一起剝皮案震驚了整個(gè)濱河市袱结,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌途凫,老刑警劉巖垢夹,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異维费,居然都是意外死亡果元,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門犀盟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來而晒,“玉大人,你說我怎么就攤上這事阅畴〕酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)监署。 經(jīng)常有香客問我颤专,道長(zhǎng),這世上最難降的妖魔是什么钠乏? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任栖秕,我火速辦了婚禮,結(jié)果婚禮上晓避,老公的妹妹穿的比我還像新娘簇捍。我一直安慰自己,他們只是感情好够滑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布垦写。 她就那樣靜靜地躺著,像睡著了一般彰触。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上命辖,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天况毅,我揣著相機(jī)與錄音,去河邊找鬼尔艇。 笑死尔许,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的终娃。 我是一名探鬼主播味廊,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棠耕!你這毒婦竟也來了余佛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤窍荧,失蹤者是張志新(化名)和其女友劉穎辉巡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊退,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郊楣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓤荔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片净蚤。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖输硝,靈堂內(nèi)的尸體忽然破棺而出今瀑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布放椰,位于F島的核電站作烟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砾医。R本人自食惡果不足惜拿撩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望如蚜。 院中可真熱鬧压恒,春花似錦、人聲如沸错邦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撬呢。三九已至伦吠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魂拦,已是汗流浹背毛仪。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芯勘,地道東北人箱靴。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荷愕,于是被迫代替她去往敵國(guó)和親衡怀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 〇安疗、前言 本文共108張圖抛杨,流量黨請(qǐng)慎重! 歷時(shí)1個(gè)半月茂契,我把自己學(xué)習(xí)Python基礎(chǔ)知識(shí)的框架詳細(xì)梳理了一遍蝶桶。 ...
    Raxxie閱讀 18,927評(píng)論 17 410
  • 呵呵!作為一名教python的老師掉冶,我發(fā)現(xiàn)學(xué)生們基本上一開始很難搞定python的裝飾器真竖,也許因?yàn)檠b飾器確實(shí)很難懂...
    TypingQuietly閱讀 19,535評(píng)論 26 186
  • Python的裝飾器的英文名叫Decorator,要對(duì)一個(gè)已有的模塊做一些“修飾工作”厌小,所謂修飾工作就是想給現(xiàn)有的...
    Spareribs閱讀 672評(píng)論 1 11
  • “愛情有先來后到璧亚,婚姻卻沒有” 一個(gè)若僵首領(lǐng)讨韭,一個(gè)宣陽王姬。 一個(gè)灑脫不羈,一個(gè)溫婉可人透硝。 一個(gè)為了愛可以不顧一切...
    厘月閱讀 372評(píng)論 0 0
  • 一狰闪、閉音節(jié)和開音節(jié) 有收音的音節(jié)叫閉音節(jié),沒有收音的音節(jié)叫開音節(jié)(標(biāo)準(zhǔn)韓國(guó)語第一冊(cè)P25 第三行) 二濒生、自動(dòng)詞和他...
    韓語小助手閱讀 403評(píng)論 0 2