美文网首页《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'>)

    相关文章

      网友评论

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

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