Python入门笔记—第十章【面向对象之OOP(第四部分,MiXin)】
1 Mixin概念及作用
- 解决多重继承出现的问题
- 给一个类增加多个功能,在设计类时不再优先考虑通过复杂的多重继承机制,而是优先考虑通过多重继承来组合多个Mixin功能
假设要设计以下4种动物的类:
Dog::狗
Bat:蝙蝠
Parrot:鹦鹉
Ostrich:鸵鸟
- 按照哺乳动物和鸟类可按下面的形式划分
- 区分其中能跑和能飞的动物可按照下面形式划分:
- 按照能跑的哺乳类和能飞的哺乳类,能跑的鸟类和能飞的鸟类来划分,可按如下形式
- 如果再在类别中增加宠物类和非宠物类,那么就分类的量而言会呈指数的形式上升
- 因此,正确的做法是采用多重继承
#按照多重继承的方式来设计
class Animal():
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
- 在设计类的关系时,通常主线都是单一的继承下来的。例如Dog继承自Mammal,Parrot继承自Bird。但是,如果需要额外"混入"其他的功能,通过多重继承就能实现。例如,让Dog继承自Mammal外,同时再具有Runnable的功能,这种设计思想称之为Mixin。
- 为了能够更好的看出继承关系,通常写成RunnableMixin的形式。类似的还可以定义肉食性动物CarnivorousMixin和植食性动物HerbivoresMixin
#按照多重继承的方式来设计
class Animal():
pass
class Mammal(Animal):
pass
class RunnableMixin(): #Mixin设计思想
print("Running")
class FlyableMixin():
print("Flying")
class CarnivorousMixin():
print("Eating meat")
class HerbivoresMixin():
print("Eating vagetables")
class Dog(Mammal,RunnableMixin,CarnivorousMixin): #利用Mixin设计的思想可以让类增加多个功能
pass
class Parrot(Bird,Flyable,HerbivoresMixin):
pass
2 使用Mixin注意事项以及优点
2.1 注意事项
- 表示单一的功能,而不是某个物品或者说某个类别,注重功能性
- 职责单一,如果需要多个功能,则写多个Mixin
- 子类即使没有继承这个Mixin类,也能照常工作,只是缺少了某个功能
2.2 优点
- 可以在不对类进行修改的情况下,对类的功能进行扩展
- 可以方便的阻止和维护不同功能组件的划分
- 可以根据需要任意调整功能的组合
- 可以避免创建很多新的类,导致复杂的继承关系