python 混入類MixIn

?寫在前面

能把一件事情說的那么清楚明白,感謝廖雪峰的官方網站。

?

1.為什么要用混入類?(小白入門)

繼承是面向對象編程的一個重要的方式,因為通過繼承,子類就可以擴展父類的功能。

?

step1:

回憶一下Animal類層次的設計,假設我們要實現以下4種動物:

  • Dog - 狗狗;
  • Bat - 蝙蝠;
  • Parrot - 鸚鵡;
  • Ostrich - 鴕鳥。

?

step2:

如果按照哺乳動物和鳥類歸類,我們可以設計出這樣的類的層次:

?

?

?step3:

但是如果按照“能跑”和“能飛”來歸類,我們就應該設計出這樣的類的層次:

?

?step4:

如果要把上面的兩種分類都包含進來,我們就得設計更多的層次:

  • 哺乳類:能跑的哺乳類,能飛的哺乳類;
  • 鳥類:能跑的鳥類,能飛的鳥類。

這么一來,類的層次就復雜了:

?

?step5:

如果要再增加“寵物類”和“非寵物類”,這么搞下去,類的數量會呈指數增長很明顯這樣設計是不行的

?

step6:

正確的做法是采用多重繼承。首先,主要的類層次仍按照哺乳類和鳥類設計:

?

2.MixIn混入類的的定義

?在設計類的繼承關系時,通常,主線都是單一繼承下來的,例如,Ostrich繼承自Bird。但是,如果需要“混入”額外的功能,通過多重繼承就可以實現,比如,讓Ostrich除了繼承自Bird外,再同時繼承Runnable。這種設計通常稱之為MixIn。

MixIn的目的就是給一個類增加多個功能,這樣,在設計類的時候,我們優先考慮通過多重繼承來組合多個MixIn的功能,而不是設計多層次的復雜的繼承關系。

?

Mix-in:混入類是一種Python程序設計中的技術,作用是在運行期間動態改變類的基類或類的方法,從而使得類的表現可以發生變化。可以用在一個通用類接口中。

?

混入類是為代碼重用而生的。從概念上講,混入不定義新類型,只是打包方法,便于重用。混入類應該提供某方面的特定行為,只實現少量關系非常緊密的方法并且混入類絕對不能實例化。

?

3.使用MixIn混入類有什么好處?

避免設計多層次的復雜的繼承關系,混入類是為代碼重用而生,使得代碼結構簡單清晰

?

4.MixIn繼承關系

整個體系非常清晰,各個類的職責也非常明確,且類的職責從命名就可以讀出。例如 ContextMixin 及其子類負責獲取渲染模板所需的模板變量;MultipleObjectMixin 負責從數據庫獲取模型對應的多條數據;View 負責處理 HTTP 請求(如 get 請求,post 請求);TemplateResponseMixin 及其子類負責渲染模板。各個類組合在一起就構成了功能完整的 ListView。由此看出Django設計者充分采納了一個類只負責一件事的設計理念(即單一責任原則),而且命名也是遵循一套統一的規范(...Mixin 后綴)。

繼承關系

?

?

5.MixIn混入類的例子一

為了更好地看出繼承關系,我們把RunnableFlyable,Carvorous改為RunnableMixInFlyableMixIn,CarvorousMixIn

?

?

?

6.MixIn混入類的例子二

?

?

?

6.MixIn混入類的例子三

Python自帶的很多庫也使用了MixIn。舉個例子,Python自帶了TCPServerUDPServer這兩類網絡服務,而要同時服務多個用戶就必須使用多進程或多線程模型,這兩種模型由ForkingMixInThreadingMixIn提供。通過組合,我們就可以創造出合適的服務來。

比如,編寫一個多進程模式的TCP服務,定義如下:

class MyTCPServer(TCPServer, ForkingMixIn):pass 

編寫一個多線程模式的UDP服務,定義如下:

class MyUDPServer(UDPServer, ThreadingMixIn):pass 

如果你打算搞一個更先進的協程模型,可以編寫一個CoroutineMixIn

class MyTCPServer(TCPServer, CoroutineMixIn):pass 

這樣一來,我們不需要復雜而龐大的繼承鏈,只要選擇組合不同的類的功能,就可以快速構造出所需的子類。

?

?

參考:

?https://www.liaoxuefeng.com/wiki/1016959663602400/1017502939956896

https://www.cnblogs.com/ahMay/p/5707844.html

https://cloud.tencent.com/developer/news/221202

?https://blog.csdn.net/zp357252539/article/details/82703246

http://python.tedu.cn/know/318527.html

轉載于:https://www.cnblogs.com/baxianhua/p/10881599.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于字符串流的學習(c++)

/* 字符串流 在字符數組中可以存放字符,也可以存放整數、浮點數以及其他類型的數據。在向字符數組存入數據之前,要先將數據從二進制形式轉換為ASCII代碼,然后存放在緩沖區,再從緩沖區送到字符數組。從字符數組讀數據時,先將字符數組中的數據送到緩沖區,在賦給變量前要先將ASCII…

估計很多前端都沒學過單元測試~

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。已進行四個月了,很多小伙伴表示收獲頗豐。想學源碼,極力推薦訂閱我寫的《學習…

xd可以用ui動效效果嗎_通過動畫使UI設計栩栩如生:Adobe XD和After Effects

xd可以用ui動效效果嗎Note — If you don’t fancy splashing out on an Adobe license, you can trial their products for 14 days each. That should give you more than enough time to play, check it out.注意—如果您不愿意花錢購買Adobe許可證,則可以分別試…

BookMarklet:瑞士軍刀你用了嗎?

Bookmarklet 是一段隱藏在鏈接后面的js代碼,可以收藏在收藏夾。通過這段代碼,我們可以跨瀏覽器(當然,也跨平臺)實現一些工具。比起瀏覽器插件來說,使用更加方便。典型的,dict.cn 網站的工具和有…

第十二周編程總結

這個作業屬于那個課程C語言程序設計II這個作業要求在哪里https://pintia.cn/problem-sets/1127748174659035136/problems/1127749414029729792我在這個課程的目標是更好的學習函數這個作業在那個具體方面幫助我實現目鍛煉了我的編程能力參考文獻c語言程序設計26-1 計算最長的字…

可能是全網首個前端源碼共讀活動,誠邀加入學習

大家好,我是若川。從8月份到現在11月結束了。每周一期,一起讀200行左右的源碼,撰寫輔助文章,截止到現在整整4個月了。由寫有《學習源碼整體架構系列》20余篇的若川【若川視野公眾號號主】傾力組織,召集了各大廠對于源碼…

現代游戲中的UX趨勢

ux設計中的各種地圖游戲UX (GAMES UX) Even though websites and games have matured side-by-side over the past few decades, games have a long and detailed history of user experience. Sure, it was scrappy and fairly rudimentary initially, but the only way you c…

SQL Server 2008 安裝過程中遇到“性能計數器注冊表”..

Windows 2008 系統 SQL Server 2008 性能計數器注冊表作者: 來源: 時間:2010-6-13 完美集成、增強 KindEditor HTML 編輯器今天跟隨部門老大去現場學習,安裝 Windows208 下 SQL Server2008&#xff0c…

你提交代碼前沒有校驗?巧用gitHooks解決

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。已進行四個月了,很多小伙伴表示收獲頗豐。想學源碼,極力推薦訂閱我寫的《學習…

Linux下自動化測試環境的搭建

1.安裝Linux虛擬機,詳情參考 https://blog.csdn.net/qq_22770715/article/details/78558374 https://www.cnblogs.com/Q277227/p/8176564.html 1.1 需要確定IP ,使用 ifconfig 1.2 linux的用戶名跟密碼; 1.3 確定可以遠程ssh登錄&…

code craft_以Craft.io為先—關于我們行業的實踐職業道路的系列

code craft重點 (Top highlight)For the past two decades, digital product design / UX has been shifting to become a more strategic discipline within organizations. Partially because business leaders have started to pay attention to how design-driven companie…

Nginx+httpd反代實現動靜分離

什么是動靜分離為了提高網站的響應速度,減輕程序服務器(apachephp,nginxphp等)的負載,對于靜態資源比如圖片,js,css,html等靜態文件,我們可以在反向代理服務器中設置&…

(建議收藏)前端面試必問的十六條HTTP網絡知識體系

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。已進行四個月了,很多小伙伴表示收獲頗豐。想學源碼,極力推薦訂閱我寫的《學習…

了解 DB2 Version 9.5 中的全局變量(轉)

轉自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0711zubiri/ 簡介 在關系數據庫系統內部,應用程序和實際數據庫之間的主要交互都是以會話或連接的 SQL 語句形式來實現的。過去,為了在相同會話中實現不同 SQL 語句之…

jQuery新版本加載json注意事項。

jQuery在1.4版本后,采用了更為嚴格的json解析方式,所以所有內容都必須要有雙引號。比如以前{key:”28CATEGORY”,status:”0″}是沒問題的。但升級成1.4后,都必須加上雙引號:{“key” : “28CATEGORY”,“status” : “0″}如果你…

多邊形的時針方向與法線方向

從相反的法線方向觀察,順時針還是逆時針是相反的。 多邊形的時針方向與法線方向的關系呈右手法則關系。 GoogleEarth中的面具有時針方向,法線方向為正向,反之為負向 GoogleEarth的垂面在法線方向為亮色,反向為暗色 GoogleEarth的水…

裂墻推薦!再也不用求后端給接口了...

大家好,我是若川。今天咱們來介紹一款強大的云服務平臺!MemFire Cloud注冊即享5GB存儲空間、每月100萬讀額度和每月10萬寫額度。平臺入口:https://memfiredb.com/今天(12月10號)還有限時的送書活動!感興趣的…

1.今日標簽:視頻價值一千字

I love the App Store. It looks and works better than ever. But also, I love tricky design challenges. How do you improve something that already works great?我喜歡App Store。 它的外觀和工作比以往更好。 但是我也很棘手 設計挑戰。 您如何改善已經很好的工作&a…

Android service 小研究

最近同學搞起了Android開發,自己也撿起來這個玩意來看看。這里先研究一下service Service是安卓系統提供的四種組件之一,功能與activity類似,只不過沒有activity 的使用頻率高。顧名思義Service就是運行在后臺的一種服務程序一般很少與用戶交…

螞蟻金服瘋了嗎?大動作,非裁員,年底全員漲薪又漲假期!!!

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。以下分享一篇水文&#…