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