python super方法的一个简单解释版本

参考:https://www.zhihu.com/question/20040039

def super(cls,inst):
    mro=inst.__class__.mro()
    return mro[mro.index(cls)+1]

1. inst 负责生成 MRO 的 list

2. 通过 cls 定位当前 MRO 中的 index, 并返回 mro[index + 1]

 

在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。

而在继承的调用,比如A集成B,C两个类,调用方法是深度树搜索,就是说先搜索B以及B祖先树上的对应方法,然后再访问C类和C的祖先树的方法。

 

B,C 拥有共同的祖先,而同个方法出现在B的祖先,以及C类上。super会调用C类的方法,然后再调用B的祖先方法;而继承调用,则优先调用B类祖先方法且不再调用C类方法。

 

如果没有复杂的继承结构,super 作用不大。而复杂的继承结构本身就是不良设计。对于多重继承的用法,现在比较推崇 Mixin 的方式,也就是
  • 普通类多重继承只能有一个普通父类和若干个 Mixin 类(保持主干单一)
  • Mixin 类不能继承普通类(避免钻石继承)
  • Mixin 类应该单一职责(参考 Java 的 interface 设计,Mixin 和此极其相似,只不过附带实现而已)
posted @ 2016-05-30 13:56  雅思敏  阅读(236)  评论(0编辑  收藏  举报