摘要:看了這一章,發現原來是裝飾器,又一新知識。期間,裝飾器會做一些額外的工作。書中介紹了模塊中的三個裝飾器。另一個是,這個裝飾器把函數結果保存了起來,避免傳入相同參數時重復計算。疊放不奇怪,裝飾器返回的就是函數或可調用對象。
在 Web 框架 Flask 中,最常看到的或許是以@app.route開頭的那行代碼。由于還是剛接觸 Flask,所以對這種語法還不熟悉。看了這一章,發現原來是裝飾器,又一新知識。
什么是裝飾器?它是一個可調用對象,接受一個函數并返回一個函數或可調用對象。期間,裝飾器會做一些額外的工作。
書上介紹了裝飾器有兩大特性,一個是「能把被裝飾的函數替換成其他函數」,另一個是「裝飾器在加載模塊時立即執行」。常用的方式是把裝飾器定義在一個模塊中,返回的是內部新定義的函數。此外,需要注意的是導入時和運行時的區別。
之后的閉包,保證了內部函數代碼的正確運行。什么是閉包?
閉包指延伸了作用域的函數,其中包含函數定義體中引用、但是不在定義體中定義的非全局變量。
閉包依舊是函數,只是其中包含了即非全部、也非本地變量的變量。這樣的變量叫做自由變量(free variable)。當要改變自由變量時,自由變量會變成本地變量。關鍵字nonlocal可以保護自由變量。
書中介紹了functools模塊中的三個裝飾器。第一個是wraps,它能把相關屬性從被裝飾的函數中正確地復制到裝飾器的內部函數中。
另一個是lru_cache,這個裝飾器把函數結果保存了起來,避免傳入相同參數時重復計算。使用它跟之前的例子有點不同:@functools.lru_cache(),因為它可以接受配置參數,即緩存結果的數目和是否把不同類型的結果分開保存。被lru_cache裝飾的函數的所有參數必須是可散列的,因為它使用字典存儲結果,鍵根據調用時傳入的定位參數和關鍵字參數創建。
最后一個是singledispatch,被它裝飾的函數會變成泛函數(generic function),類似 Lisp 中的 generic function。在 Java 的類中,類似于方法重載。
裝飾器一個強大的能力就是支持疊放,另一個是參數化。疊放不奇怪,裝飾器返回的就是函數或可調用對象。而參數化中,接受參數的裝飾器叫做裝飾器工廠函數,它返回的是一個裝飾器,之后把它應用到要裝飾的函數上。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41645.html
摘要:函數裝飾器和閉包嚴格來說,裝飾器只是語法糖。何時執行裝飾器它們在被裝飾的函數定義之后立即運行。裝飾器突出了被裝飾的函數的作用,還便于臨時禁用某個促銷策略只需把裝飾器注釋掉。 函數裝飾器和閉包 嚴格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規的可調用對象那樣調用,其參數是另一個函數。有時,這樣做更方便,尤其是做元編程(在運行時改變程序的行為)時。 Python何時執行裝飾器 它們在...
摘要:作者按每天一個設計模式旨在初步領會設計模式的精髓,目前采用和兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式原文地址是每天一個設計模式之裝飾者模式歡迎關注個人技術博客。 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式...
摘要:作者按每天一個設計模式旨在初步領會設計模式的精髓,目前采用和兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式原文地址是每天一個設計模式之裝飾者模式歡迎關注個人技術博客。 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式...
摘要:值得注意的是,的返回值復寫了原始的構造函數,原因是類裝飾器必須返回一個構造器函數。原始構造函數的原型被復制給的原型,以確保在創建一個的新實例時,操作符如愿以償,具體原因可參考鄙人另一篇文章原型與對象。 上一篇文章中,我們討論了TypeScript源碼中關于方法裝飾器的實現,搞明白了如下幾個問題: 裝飾器函數是如何被調用的? 裝飾器函數參數是如何傳入的? __decorate函數干了...
閱讀 1814·2021-09-22 15:54
閱讀 2923·2021-09-01 10:42
閱讀 3442·2019-08-30 15:56
閱讀 1432·2019-08-29 18:46
閱讀 2465·2019-08-29 10:57
閱讀 2703·2019-08-28 17:57
閱讀 3659·2019-08-23 18:14
閱讀 833·2019-08-23 17:03