Python: super真的是调用父类吗?

问题1:既然重写了子类的构造函数,为什么还需要去调用super?

问题2:super到底执行顺序是什么样的?


答1:不是所有的子类都有必要去调用super。

假设继承Thread,在初始化函数里面需要赋值name。但真的需要赋值吗?

其实Thread类的初始化函数本身就做了很多判断,所以没必要写冗余代码。

所以把构造函数交给父类Thread去实例化,不用自己再去写不必要的逻辑了。


答2:super并不是去调用父类的方法。

其执行顺序牵涉到类属性和示例属性以及其查找顺序。【即MRO算法(深度优先、广度优先、c3算法)】

实操:

Python: super真的是调用父类吗?

 

结果是先打印D再打印B,这是没问题的。关键是B后打印的是C而不是A。

这就证明了super()真的不是调用父类而是调用MRO(_mro)这个顺序里的下一个类.[这就需要您知道类和实例属性的查找顺序—mro查找]