Python面向对象-多重继承之MixIN

以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告诉我们要优先考虑通过多继承来组合多个功能,而不是设计多层次的复杂的继承关系。

 

posted on 2018-03-08 23:32 风雨一肩挑 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/hiwuchong/p/8531570.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值