美文网首页python开发程序员代码改变世界
剖析python子类调用父类方法

剖析python子类调用父类方法

作者: kuulid | 来源:发表于2017-07-30 13:01 被阅读90次

super()多重继承会"自动去重"

在上面代码子类中,class son(Father) Father指的明显是父类,那在调用父类方法的时候,可不可以直接Father('tom') Father('tom')呢?
在大多数情况下是没问题的。
但在涉及多重继承的时候,就会有麻烦,如

    class Person():
        def __init__(self):
            print('person init')

    class Father(Person):
        def __init__(self, name):
            Person.__init__(self)
            print('father name is ' + name)
            self.name = name
        def run(self):
            print(self.name + ' is run')
            
    class Mother(Person):
        def __init__(self, name):
            Person.__init__(self)
            print('mother name is ' + name)
            self.name = name
        def run(self):
            print(self.name + ' is walk')

    class Son(Father, Mother):
        def __init__(self, name):
            Father.__init__(self, 'tom')
            Mother.__init__(self, 'Merry')
            self.name = name

    s = son('kk')

可以看到输出

person init
father name is tom
person init
mother name is Merry

Person类被初始化了两次,而将调用父类的代码都修改为super()调用,就会发现每个 __init__()方法都只调用了一次。似乎python会自动去重。

python是如何实现继承的

针对每一个定义的类,Python都会计算出一个线性方法的解析顺序(MRO)的列表。
可以打印类的__mro__属性看到MRO的继承顺序列(基于python3):

print(Son.__mro__)
(<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.Person'>, <class 'object'>)

python会从MRO列表中从左到右依次如查找,直到找到待查的属性为止,并且让每个方法只调用一次。

相关文章

  • python 面向对象: super()

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

  • 剖析python子类调用父类方法

    super()多重继承会"自动去重" 在上面代码子类中,class son(Father) Father指的明显是...

  • python重要知识点总结一

    内容包含: 元类 python 对象和类的绑定以及类方法,静态方法 python 子类调用父类方法总结 pytho...

  • Python 子类继承父类构造函数说明

    Python 子类继承父类的两种写法: 如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父...

  • iOS 小知识点总结

    子类实现父类方法时,监测子类是否调用super方法。 在父类中声明方法时: 子类中实现该父类方法: 图片压缩

  • 调用被子类重写的方法

    在一般情况一下,子类可以调用父类的方法,因为子类继承父类,会获得父类的成员变量和方法,但父类不可以调用子类的方法,...

  • 多态

    向上转型,隐式转换,自动转型 父类引用指向子类,可以调用子类重写父类方法,及父类派生的方法,但无法调用子类特有的方...

  • scala 调用java通过父类调用子类方法实现

    scala 调用java通过父类调用子类方法实现 java 父类 A 抽象类: java 子类 B 继承A类,并...

  • 向上转型&向下转型

    向上转型也称为隐式转型或者自动转型父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类...

  • 接口 对象名=new 类名 和类名 对象名 =new 类名的区别

    接口。多态,子类继承父类,父类引用指向子类对象,可以调用子类重写的方法。后者可调用的方法多一些。

网友评论

    本文标题:剖析python子类调用父类方法

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