class Base1:
def eat(self):
print("我是可怜的Base1")
class Base2:
def eat(self):
print("我是可怜的Base2")
class Base3:
def eat(self):
print("我是可怜的Base3")
class Bar(Base1, Base2, Base3):
def eat(self):
print("我是Bar里面的吃1")
super(Bar, self).eat()
super().eat()
super(Base1, self).eat()
print("我是Bar里面的吃2")
b = Bar()
b.eat()
由上面的代码可知,这是一个非常简单的MRO相应的继承顺序为:Bar, Base1, Base2, Base3, object
既然知道类的MRO后,那么方法的执行就一目了然了。
现在唯一不明白的就是super了,super()可以帮助我们执行MRO下个父类中的方法,通常super()有两个使用的地方:
- 可以访问父类中的构造方法。
- 子类方法想调用父类(MRO)中的方法。
既然知道super是干啥的了,那下面的输出结果就好说了。
由代码执行顺序可知,运行后分别创建了Base1,Base2,Base3,Bar这四个类,然后实例化了Bar类中的b对象,最后调用了b对象中的eat方法。
那么代码的执行结果就出来了:
第一个打印出来的是:我是Bar里面的吃1
第二个打印的是:我是可怜的Base1
,那这个结果怎么出来的呢,super是调用父类中的方法,如果加上参数类,则调用下一个类中的方法,在这Bar类的下一个MRO是Base1类,所以这条语句执行了Base1类中的eat方法。
第三个打印的是:我是可怜的Base1
,为什么跟上面的一样呢,其实这段代码是上段代码的简写版,只是省略了括号中的类名和self。
第四个打印的是:我是可怜的Base2
,其实你要是明白第二个结果的话,这个也不再话下,super(类名, self) 从某个类开始找下一个MRO。
第五个就更简单了,里面没有继承关系直接打印:我是Bar里面的吃2
如果你要是不明白怎么计算MRO的话,可以执行以下命令print(Bar.__mro__)
直接打印出相应的继承关系。
(<class '__main__.Bar'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class '__main__.Base3'>, <class 'object'>)