1 使用父类名.方法名调用父类方法
class Parent():
def __init__(self,name):
self.name = name
print("Parent的init方法被调用")
class Son1(Parent):
def __init__(self,name,age):
self.age = age
Parent.__init__(self,name)
print("Son1的init方法被调用")
class Son2(Parent):
def __init__(self,name,gender):
self.gender = gender
Parent.__init__(self,name)
print("Son2的init方法被调用")
class Grandson(Son1,Son2):
def __init__(self,name,age,gender):
Son1.__init__(self,name,age)
Son2.__init__(self,name,gender)
print("Grandson的init方法被调用")
g = Grandson("laowang",22,"男")
输出结果:
Parent的init方法被调用
Son1的init方法被调用
Parent的init方法被调用
Son2的init方法被调用
Grandson的init方法被调用
2 使用super().方法名的方式调用父类方法:
class Parent():
def __init__(self,*args):
self.name = args[2]
print("Parent的init方法被调用")
class Son1(Parent):
def __init__(self,*args):
name,self.age,gender = args
super().__init__(*args)
print("Son1的init方法被调用")
class Son2(Parent):
def __init__(self,*args):
name,age,self.gender = args
super().__init__(*args)
print("Son2的init方法被调用")
class Grandson(Son1,Son2):
def __init__(self,name,age,gender):
super().__init__(name,age,gender)
print("Grandson的init方法被调用")
g = Grandson("laowang",22,"男")
print(Grandson.__mro__)
输出结果:
Parent的init方法被调用
Son2的init方法被调用
Son1的init方法被调用
Grandson的init方法被调用
(<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>)
由上述代码得出结论:
使用父类名.方法名()方式调用父类方法在多重继承中会造成父类被重复调用。
而使用super().方法名()方式调用父类方法则不会重复调用。
关于使用super()调用父类方法时代码的执行顺序:
使用类名.__mro__可以查看当前类的多重继承执行顺序,该执行顺序是使用C3算法计算得出。
而C3算法使用的是BFS算法(广度优先搜索算法),在二叉树中表现为尽可能的寻找更多分叉。