使用super来调用父类中的方法

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()有两个使用的地方:

    1. 可以访问父类中的构造方法。
    1. 子类方法想调用父类(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__)直接打印出相应的继承关系。
(, , , , )

你可能感兴趣的:(使用super来调用父类中的方法)