python开发程序员代码改变世界

剖析python子类调用父类方法

2017-07-30  本文已影响90人  kuulid

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列表中从左到右依次如查找,直到找到待查的属性为止,并且让每个方法只调用一次。

上一篇 下一篇

猜你喜欢

热点阅读