美文网首页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子类调用父类方法

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