美文网首页《Django By Example》
使用super来调用父类中的方法

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

作者: 飞跑的蛤蟆 | 来源:发表于2019-03-10 22:20 被阅读1次
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__)直接打印出相应的继承关系。
(<class '__main__.Bar'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class '__main__.Base3'>, <class 'object'>)

相关文章

  • python 面向对象: super()

    python 关于 super 的使用 子类对象调用父类方法 :super(B,b).hh() 子类中调用父类方法...

  • JavaScript零散知识点

    继承 super 在子类中调用super,会调用父类的方法; 不用super,则会覆盖父类的方法。调用本类中的方法。

  • 多继承以及MRO顺序

    使用父类名称.方法的方式调用父类方法,会导致父类的父类方法被多次调用 如果使用super().方法的方式,,,,类...

  • Super

    编译器的指令符号如果想在子类调用父类的方法使用Super在类方法中调用父类的类方法在对象方法调用父类的对象方法可以...

  • super关键字

    super的作用: 直接调用父类中的某个方法 super处在对象方法中,那么就会调用父类的对象方法,super处在...

  • super和self关键字的区别

    super在类方法中, 一定会调用父类的类方法super在对象方法中, 一定会调用父类的对象方法可以利用super...

  • python中super的使用

    super的简单用法 多继承中super的使用   super简单的说是调用父类的方法,不管是父类的初始化方法还是...

  • super

    java 类中使用super来调用父类中的指定操作。 super 可以用于访问父类中定义的属性 s...

  • 继承 多态 接口

    类的继承 子类可以在其构造方法中使用super()语句调用父类的构造方法 也可以在子类中使用super关键字调用父...

  • 多继承以及MRO顺序

    1、单独调用父类的方法 2、多继承中super调用所有父类的被重写方法 3、单继承中super() 总结 supe...

网友评论

    本文标题:使用super来调用父类中的方法

    本文链接:https://www.haomeiwen.com/subject/pzappqtx.html