zoukankan      html  css  js  c++  java
  • Python3之多重继承

      继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。

      Animal类层次的设计,假设我们要实现以下4中动物

    Dog-狗狗
    Bat-蝙蝠
    Parrot-鹦鹉
    Ostrich-鸵鸟
    

      如果按照哺乳动物和鸟类,我们可以设计出这样的层次

      如果按照能跑和能飞来分类,我们就应该设计出这样的层数

      如果要把上面的两种分类都包含进来,我们就得设计更多的层次

      

    • 哺乳类:能跑的哺乳类,能飞的哺乳类;
    • 鸟类:能跑的鸟类,能飞的鸟类。

      如果要再增加其他分类,如宠物类,非宠物类,类的数量会呈指数级增长,很明显这样设计不行

      正确的做法是采用多重继承。首先,主要的类层次扔按照哺乳和鸟类设计:

    class Animal(object):
      pass
    class Mammal(Animal):
      pass
    class Bird(Animal):
      pass
    class Dog(Mammal):
      pass
    class Bat(Mammal):
      pass
    class Parrot(Bird):
      pass
    class Ostrich(Bird):
      pass
    

      现在,我们要给动物再加上Runnable和Flyable的功能,只需要先定义好Runnable和Flyable的类

    class Runnable(object):
      def run(self):
        print('Running...')
    
    class Flyable(object):
      def fly(self):
        print('Flying...')
    

      对于需要Runnable功能的动物,就多继承一个Runnable,例如Dog

     class Dog(Mammal,Runnable):
       pass
    

      对于需要Flyable功能的动物,就多继承一个Flyable,例如Bat

     class Bat(Mammal,Flyable):
       pass
    

      通过多重继承,一个子类就可以同时获得多个父类的所有功能

      

      MixIn

      在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为MixIn。

    为了更好地看出继承关系,我们把RunnableFlyable改为RunnableMixInFlyableMixIn。类似的,你还可以定义出肉食动物CarnivorousMixIn和植食动物HerbivoresMixIn,让某个动物同时拥有好几个MixIn:

    class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
        pass
    

      这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。

      

      多重继承假如不同的大类定义了相同的方法或属性,在子类调用的时候优先级是怎么样的 ,参考 :https://www.cnblogs.com/minseo/p/11102757.html

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/minseo/p/11102773.html
Copyright © 2011-2022 走看看