摘要:有一些定制類的特殊方法,如,其中一些具有動態特性的方法可以用來很方便地處理某些動態狀況。動態化屬性和方法的調用,當調用不存在的屬性時,如果存在方法,就會調用方法來嘗試獲得屬性。這種完全動態的調用可以應對一些動態情況,例如實現。
Python有一些定制類的特殊方法,如__str__()、__iter__()、__getitem__(),其中一些具有動態特性的方法可以用來很方便地處理某些動態狀況。
Duck-typingWhen I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.
duck-typing是一種編程風格,它的含義是:一個對象的語義,不是由于它繼承自特定的類或者實現某個接口,而是由它的屬性和方法的集合所決定。也就是說,我們在使用一個對象的時候,不在乎它是什么類型、是否實現了特定的接口,而是在意它有沒有我們需要的屬性和方法。
其實這就是在沒有語言約束的情況下來實現多態,不像C++使用繼承和虛函數在語言上設置約束來實現多態,所以就需要程序員來進行約束,好的文檔、代碼、測試都是很需要的。
在用該風格編碼時不要使用像type()、isintance()這樣的方法去測試函數中參數的類型,而是直接使用參數來表述行為,如果該參數沒有應有的屬性或方法,就會報錯。
使用__getitem__()來使自己的類表現得和Python內建的list、tuple、dict一樣時,就依靠了這種風格,下面給出Wiki上關于duck-typing的Python示例代碼:
class Duck: def quack(self): print("Quaaaaaack!") def feathers(self): print("The duck has white and gray feathers.") class Person: def quack(self): print("The person imitates a duck.") def feathers(self): print("The person takes a feather from the ground and shows it.") def name(self): print("John Smith") def in_the_forest(duck): duck.quack() duck.feathers() def game(): donald = Duck() john = Person() in_the_forest(donald) in_the_forest(john) game()
in_the_forest(duck)方法不管duck參數是Duck類型還是Person類型,只要該類型的實例由quack和feathers方法就可以。
動態化屬性和方法的調用__getattr__,當調用不存在的屬性時,如果存在__getattr__方法,就會調用__getattr方法來嘗試獲得屬性。
__call__,使實例本身變成可調用的。
這種完全動態的調用可以應對一些動態情況,例如實現REST API。
class Chain(object): def __init__(self, path=""): self._path = path def __getattr__(self, path): return Chain("%s/%s" % (self._path, path)) def __str__(self): return self._path def __call__(self, attr): return Chain("%s/%s" % (self._path, attr))
這樣我們就不用給每個URL對應的API寫方法了,采用鏈式的調用就可以,如schools/status/users,就可以用Chain().schools.status.users。某些REST API會在URL中添加參數,如/schools/users/ID/report,其中ID就是一個參數,是某個學生實際的學號,這時就可以利用__call__將對象變成可調用的,便可完成此功能,調用方式就是Chain().schools.users(ID).report。
參考資料廖雪峰的Blog
Python官方文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45392.html
摘要:在軟件測試活動中,作為一名測試人員有沒有遇到過這樣的場景,在測試一個特性或者制定一份測試方案時,往往會想著進行簡單測試做簡單設計,認為這個場景出現的概率太低,幾乎不可能會存在,不測了實際應用時不可能會有這么大的用戶量, ...
摘要:基于的私有云混合云構建方案蘇依蜀黍是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的可移植的自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括虛擬機集群和其他的基礎應用平臺。 container-as-a-service-0x01 -- 基于Docker的私有云&混合云構建方案 By 蘇依蜀黍 . 2016.06.07 what Docker是一...
摘要:近日它們交鋒的戰場就是動態計算圖,誰能在這場戰爭中取得優勢,誰就把握住了未來用戶的流向。所以動態框架對虛擬計算圖的構建速度有較高的要求。動態計算圖問題之一的多結構輸入問題的高效計 隨著深度學習的發展,深度學習框架之間競爭也日益激烈,新老框架紛紛各顯神通,想要在廣大DeepLearner的服務器上占據一席之地。近日它們交鋒的戰場就是動態計算圖,誰能在這場戰爭中取得優勢,誰就把握住了未來用戶的流...
摘要:了解了攻擊者利用的一些原理,就對應的可以找到一些對應措施在服務端驗證的字段。因此,從某些方面來說,是相對安全的。個人覺得相對安全的做法就是既驗證,同時也校驗。整個過程雖然比較難,但這讓自己對于有了更深刻的認識。 CSRF CSRF(Cross Site Request Forgery, 跨站域請求偽造)的定義,相信大家都不陌生。它是指攻擊者通過誘導用戶,打開已精心設計好的頁面后,發送請...
摘要:如果使用阿里云函數計算,您將高峰期每小時的訪問日志,或者低谷期每小時的訪問日志交給一個計算函數處理,并將處理結果存到中。下面結合阿里云的函數計算產品來講解各個應用場景中架構以及如何解決的場景中的痛點。 摘要: Serverless概念是近年來特別火的一個技術概念,基于這種架構能構建出很多應用場景,適合各行各業,只要對輕計算、高彈性、無狀態等場景有訴求的用戶都可以通過本文來普及一些基礎概...
閱讀 2596·2023-04-25 15:07
閱讀 705·2021-11-24 10:21
閱讀 2299·2021-09-22 10:02
閱讀 3517·2019-08-30 15:43
閱讀 3222·2019-08-30 13:03
閱讀 2287·2019-08-29 17:18
閱讀 3586·2019-08-29 17:07
閱讀 1873·2019-08-29 12:27