多重繼承

 

繼承是面向對象編程的一個重要的方式,經過繼承,子類就能夠擴展父類的功能
因爲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協程

相關文章
相關標籤/搜索