以Animal类为例,假设要实现以下4种动物:
Dog(狗)、Bat(蝙蝠)、Parrot(鹦鹉)和Ostrich(鸵鸟)
如果按照哺乳类和鸟类来区分的话,可以这样设计:
Animal:
|--Mammal
|--Dog
|--Bat
|--Bird
|--Parrot
|--Ostrich
但是,如果按照能跑和能飞来归类的话,又可以这么设计:
Animal:
|--Runnable
|--Dog
|--Ostrich
|--Flyable
|--Parrot
|--Bat
如果再以宠物类和非宠物类等等规则来划分的话,类的数量会非常非常多的。
python允许我们使用多重继承来设计。
首先,我们仍然将哺乳类和鸟类作为类层次的最主要部分来设计:
>>> 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的类,然后对需要Runnable和Flyable功能的动物,直接继承相应的类即可,实现一个子类同时获得多个父类的所有功能:
>>> class Runnable(object): ... pass ... >>> class Flyable(object): ... pass ... >>> class Runnable(object): ... def run(self): ... print('能走') ... >>> class Flyable(object): ... def fly(self): ... print('飞喽') ... >>> class Dog(Mammal,Runnable): ... pass ... >>> class Bat(Mammal,Flyable): ... pass ... >>> d = Dog() >>> d.run() 能走
MixIN
我们在设计类的时候,建议主线单一继承,例如Ostrich继承自Bird,但是当需要添加额外的功能时,可以通让Ostrich同时继承Bird和Runnable,这样Ostrich就会同时获得Bird和Runnable的所有属性和方法。这种设计通常叫做MixIN。
例如,我们还可以定义肉食动物Carnivorous和植食动物Herbivores,让Dog同时拥有好多的MixIN:
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn): pass
最后,MixIN告诉我们要优先考虑通过多继承来组合多个功能,而不是设计多层次的复杂的继承关系。