亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

流暢的 Python - 5. 裝飾器與閉包

Markxu / 2544人閱讀

摘要:看了這一章,發(fā)現(xiàn)原來是裝飾器,又一新知識(shí)。期間,裝飾器會(huì)做一些額外的工作。書中介紹了模塊中的三個(gè)裝飾器。另一個(gè)是,這個(gè)裝飾器把函數(shù)結(jié)果保存了起來,避免傳入相同參數(shù)時(shí)重復(fù)計(jì)算。疊放不奇怪,裝飾器返回的就是函數(shù)或可調(diào)用對(duì)象。

在 Web 框架 Flask 中,最常看到的或許是以@app.route開頭的那行代碼。由于還是剛接觸 Flask,所以對(duì)這種語法還不熟悉。看了這一章,發(fā)現(xiàn)原來是裝飾器,又一新知識(shí)。

什么是裝飾器?它是一個(gè)可調(diào)用對(duì)象,接受一個(gè)函數(shù)并返回一個(gè)函數(shù)或可調(diào)用對(duì)象。期間,裝飾器會(huì)做一些額外的工作。

書上介紹了裝飾器有兩大特性,一個(gè)是「能把被裝飾的函數(shù)替換成其他函數(shù)」,另一個(gè)是「裝飾器在加載模塊時(shí)立即執(zhí)行」。常用的方式是把裝飾器定義在一個(gè)模塊中,返回的是內(nèi)部新定義的函數(shù)。此外,需要注意的是導(dǎo)入時(shí)和運(yùn)行時(shí)的區(qū)別。

之后的閉包,保證了內(nèi)部函數(shù)代碼的正確運(yùn)行。什么是閉包?

閉包指延伸了作用域的函數(shù),其中包含函數(shù)定義體中引用、但是不在定義體中定義的非全局變量。

閉包依舊是函數(shù),只是其中包含了即非全部、也非本地變量的變量。這樣的變量叫做自由變量(free variable)。當(dāng)要改變自由變量時(shí),自由變量會(huì)變成本地變量。關(guān)鍵字nonlocal可以保護(hù)自由變量。

書中介紹了functools模塊中的三個(gè)裝飾器。第一個(gè)是wraps,它能把相關(guān)屬性從被裝飾的函數(shù)中正確地復(fù)制到裝飾器的內(nèi)部函數(shù)中。

另一個(gè)是lru_cache,這個(gè)裝飾器把函數(shù)結(jié)果保存了起來,避免傳入相同參數(shù)時(shí)重復(fù)計(jì)算。使用它跟之前的例子有點(diǎn)不同:@functools.lru_cache(),因?yàn)樗梢越邮芘渲脜?shù),即緩存結(jié)果的數(shù)目和是否把不同類型的結(jié)果分開保存。被lru_cache裝飾的函數(shù)的所有參數(shù)必須是可散列的,因?yàn)樗褂米值浯鎯?chǔ)結(jié)果,鍵根據(jù)調(diào)用時(shí)傳入的定位參數(shù)和關(guān)鍵字參數(shù)創(chuàng)建。

最后一個(gè)是singledispatch,被它裝飾的函數(shù)會(huì)變成泛函數(shù)(generic function),類似 Lisp 中的 generic function。在 Java 的類中,類似于方法重載。

裝飾器一個(gè)強(qiáng)大的能力就是支持疊放,另一個(gè)是參數(shù)化。疊放不奇怪,裝飾器返回的就是函數(shù)或可調(diào)用對(duì)象。而參數(shù)化中,接受參數(shù)的裝飾器叫做裝飾器工廠函數(shù),它返回的是一個(gè)裝飾器,之后把它應(yīng)用到要裝飾的函數(shù)上。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41645.html

相關(guān)文章

  • 流暢python讀書筆記-第七章-函數(shù)裝飾器和閉包

    摘要:函數(shù)裝飾器和閉包嚴(yán)格來說,裝飾器只是語法糖。何時(shí)執(zhí)行裝飾器它們?cè)诒谎b飾的函數(shù)定義之后立即運(yùn)行。裝飾器突出了被裝飾的函數(shù)的作用,還便于臨時(shí)禁用某個(gè)促銷策略只需把裝飾器注釋掉。 函數(shù)裝飾器和閉包 嚴(yán)格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,其參數(shù)是另一個(gè)函數(shù)。有時(shí),這樣做更方便,尤其是做元編程(在運(yùn)行時(shí)改變程序的行為)時(shí)。 Python何時(shí)執(zhí)行裝飾器 它們?cè)?..

    Hydrogen 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式之裝飾者模式

    摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式...

    brianway 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式之裝飾者模式

    摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式...

    shleyZ 評(píng)論0 收藏0
  • 裝飾器與元數(shù)據(jù)反射(2)屬與類性裝飾

    摘要:值得注意的是,的返回值復(fù)寫了原始的構(gòu)造函數(shù),原因是類裝飾器必須返回一個(gè)構(gòu)造器函數(shù)。原始構(gòu)造函數(shù)的原型被復(fù)制給的原型,以確保在創(chuàng)建一個(gè)的新實(shí)例時(shí),操作符如愿以償,具體原因可參考鄙人另一篇文章原型與對(duì)象。 上一篇文章中,我們討論了TypeScript源碼中關(guān)于方法裝飾器的實(shí)現(xiàn),搞明白了如下幾個(gè)問題: 裝飾器函數(shù)是如何被調(diào)用的? 裝飾器函數(shù)參數(shù)是如何傳入的? __decorate函數(shù)干了...

    Shisui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<