繼承是面向對象編程的一個重要的方式,經過繼承,子類就能夠擴展父類的功能
因爲Python容許使用多重繼承,所以,MixIn就是一種常見的設計
只容許單一繼承的語言(如Java)不能使用MixIn的設計編程
一般的繼承關係設計以下:
繼承關係:Animal
Dog(Animal)
Bat(Animal)
Ostrich(Animal)
Parrot(Animal)
按照哺乳動物和鳥類歸類,要這樣設計:
Animal
Mammal(Animal)
Dog(Mammal)
Bat(Mammal)
Bird(Animal)
Ostrich(Bird)
Parrot(Bird)
按照"能跑"和"能飛"來歸類,要這樣設計:
Animal
Runnable(Animal)
Dog(Runnable)
Ostrich(Runnable)
Flyable(Animal)
Bat(Flyable)
Parrot(Flyable)
要把上面的兩種分類都包含進來,要這樣設計:
Animal
Mammal(Animal)
MRun(Mammal)
Dog(MRun)
MFly(Mammal)
Bat(MRun)
Bird(Animal)
BRun(Bird)
Ostrich(BRun)
BFly(Bird)
Parrot(BRun)網絡
若是要再增長其餘的類別,類的數量會呈指數增加,很明顯這樣設計是不行的多線程
正確的作法是採用多重繼承,經過多重繼承,一個子類就能夠同時得到多個父類的全部功能線程
Runnable
Flyable
Animal
Mammal(Animal)
Dog(Mammal,Runnable) 對於須要Runnable功能的動物,就多繼承一個Runnable
Bat(Mammal,Flyable) 對於須要Flyable功能的動物,就多繼承一個Flyable
Bird(Animal)
Ostrich(Bird,Runnable)
Parrot(Bird,Flyable)設計
MixIn
在設計類的繼承關係時,一般,主線都是單一繼承下來的
但若是須要加入額外的功能,經過多重繼承就能夠實現,這種設計一般稱之爲MixIn
MixIn的目的就是給一個類增長多個功能,這樣,在設計類的時候,優先考慮經過多重繼承來組合多個MixIn的功能,而不是設計多層次的複雜的繼承關係
這樣一來,咱們不須要複雜而龐大的繼承鏈,只要選擇組合不一樣的類的功能,就能夠快速構造出所需的子類
以下:
RunnableMixIn 名稱帶後綴MixIn表示該功能是繼承子類須要追加的功能
FlyableMixIn
Animal
Mammal(Animal)
Dog(Mammal,RunnableMixIn) 對於須要Runnable功能的動物,就多繼承一個RunnableMixIn
Bat(Mammal,FlyableMixIn) 對於須要Flyable功能的動物,就多繼承一個FlyableMixIn
Bird(Animal)
Ostrich(Bird,RunnableMixIn)
Parrot(Bird,FlyableMixIn)
Python內置的不少庫也使用了MixIn
如Python自帶了TCPServer和UDPServer這兩類網絡服務,而要同時服務多個用戶就必須使用多進程或多線程模型
這兩種模型由ForkingMixIn和ThreadingMixIn提供。經過組合,咱們就能夠創造出合適的服務來
編寫一個多進程模式的TCP服務:class MyTCPServer(TCPServer, ForkingMixIn): pass
編寫一個多線程模式的UDP服務:class MyUDPServer(UDPServer, ThreadingMixIn): pass
編寫一個更先進的協程模型:class MyTCPServer(TCPServer, CoroutineMixIn): pass協程