python学习笔记-多重继承和Mixin

xcwong

我们前面理解了类。类就是把具体事物给抽象出来。其实也有归类、类别的意思。
我们举一个例子:
人的职业有Teacher、Coder、Writer、Singer等职业
继承关系就是:

           People
   ___________|___________
  |       |       |       |
Teacher  Coder  Writer  Singer

但是有这么一类人比较特殊,白天上班码代码(Coder),晚上写文章(Writer),我们叫他为CoderWriter。
那么CoderWriter必须是继承了Coder类,也继承了Writer类。这就是多继承。
如果此时依旧是使用单继承实现起来就会比较傻(比如在People下再定义一个CodeWriter类,继承Coder类,然后再把Writer类里的代码复制过来)。
但是多重继承也不是万金油,也会带泪诸多问题:

  1. 结构复杂化
    单继承中一个类的父类是什么,父类的父类是什么非常明确。多继承一个类有多个父类,父类又有多个父类,继承关系复杂。

  2. 优先顺序模糊
    多重继承的优先顺序,方法调用顺序不明确。

  3. 功能冲突
    当父类中有相同的方法的时候,继承的是哪个方法不明确。

为了解决上述问题,不同的编程方法采用不同的解决方法。
例如java采用只能extends一个父类,但是可以实现多个interface的方法。
python则采用Mixin的方式。
在松本行弘的《松本行弘的程序世界》中介绍了Ruby中mixin类的几个原则

  • 通常的继承用单一继承

  • 第二个以及两个以上的父类必须是Mix-in的抽象类
    python中的多重继承应该也适用。继承反应的I am,Mixin反应的是I can。

我们可以通过Mixin的方式将某些能力添加给某一些类。

回到上面举例的例子。我们的继承关系可以这么来:

    People   
       |     Writable
       |        |
       Coder    |
       |      |——
       Somebody

这样我们即保持相对单一的继承关系,又能享受多继承带来的好处。

这篇文章仅仅是供自己加深理解使用,可能存在许多错误。还请谅解。
更多的资料可以阅读知乎上的回答:https://www.zhihu.com/questio...
或者书籍《松本行弘的程序世界》

阅读 5.1k

helloword
happy coding

hello world

502 声望
20 粉丝
0 条评论

hello world

502 声望
20 粉丝
宣传栏