zoukankan      html  css  js  c++  java
  • Python基础 | 类继承中的super调用

    在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现。

    class Animal(object):
        def __init__(self, name,age):
            self.name = name
            self.age = age
            print("父类中的init")
    class Dog(Animal):
        def __init__(self, name,age,sex):
            super().__init__(name,age)     # 继承父类中的name和age属性
            self.sex = sex
            print("%s狗的年龄为%d,性别为%s"%(self.name,self.age,self.sex))
    d = Dog("Tom",11,"male")
    

     执行结果:

    父类中的init
    Tom狗的年龄为11,性别为male
    

     看了上面的使用,你可能会觉得 super 的使用很简单,无非就是获取了父类,并调用父类的方法。其实,在上面的情况下,super 获得的类刚好是父类,但在其他情况就不一定了,super 其实和父类没有实质性的关联。

    class Base(object):
        def __init__(self):
            print("enter Base")
            print("leave Base")
    class A(Base):
        def __init__(self):
            print("enter A")
            super().__init__()
            print("leave A")
    class B(Base):
        def __init__(self):
            print("enter B")
            super().__init__()
            print("leave B")
    class C(A, B):
        def __init__(self):
            print("enter C")
            super().__init__()
            print("leave C")
    c = C()
    

     执行结果:

    enter C
    enter A
    enter B
    enter Base
    leave Base
    leave B
    leave A
    leave C
    

     如果你认为 super 代表调用父类的方法,那你很可能会疑惑为什么 enter A 的下一句不是 enter Base 而是 enter B。因为 super 方法如果出现在多继承中的话,会涉及到一个 MRO(继承父类方法时的顺序表) 的调用顺序问题。我们可以使用类.__mro__查看调用顺序。

    print(C.__mro__)     # 查看C类的调用顺序
    

     执行结果:

    (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>)
    
  • 相关阅读:
    java TopK算法
    夫妻过河问题
    Java中数据存储分配
    STM32与ARM代码执行过程
    C中gets()函数与scanf()函数说明
    MRTG开源监控安装手册
    mysql笔记
    windows调用ubuntu下的sublimeText2环境搭建
    linux性能优化
    测试那些事儿—软测必备的Linux知识(一)
  • 原文地址:https://www.cnblogs.com/-saber/p/14275184.html
Copyright © 2011-2022 走看看