成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Markxu / 2492人閱讀

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

在 Web 框架 Flask 中,最??吹降幕蛟S是以@app.route開頭的那行代碼。由于還是剛接觸 Flask,所以對這種語法還不熟悉??戳诉@一章,發(fā)現(xiàn)原來是裝飾器,又一新知識。

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

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

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

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

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

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

另一個是lru_cache,這個裝飾器把函數(shù)結(jié)果保存了起來,避免傳入相同參數(shù)時重復(fù)計算。使用它跟之前的例子有點不同:@functools.lru_cache(),因為它可以接受配置參數(shù),即緩存結(jié)果的數(shù)目和是否把不同類型的結(jié)果分開保存。被lru_cache裝飾的函數(shù)的所有參數(shù)必須是可散列的,因為它使用字典存儲結(jié)果,鍵根據(jù)調(diào)用時傳入的定位參數(shù)和關(guān)鍵字參數(shù)創(chuàng)建。

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41645.html

相關(guān)文章

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

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

    Hydrogen 評論0 收藏0
  • 每天一個設(shè)計模式之裝飾者模式

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

    brianway 評論0 收藏0
  • 每天一個設(shè)計模式之裝飾者模式

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

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

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

    Shisui 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<