当继承的时候遇到这种情况:定义一个类,多个类继承了这个类,接着再定义一个类,他继承了这多个类。
如:
类1
类2(类1) 类3(类1) 类4(类1) ....................................
类(类2,类3, 类4......................)
此时调用第三个类创建对象时,要想每个类的构造方法都被执行,有两种方法:
①在子类中使用父类.__init__(self, 参数)来强行再如父类的构造函数。
②使用super()方法
当使用①时,此时遇到一个问题,那就是父类的构造方法可能多次重复执行,造成资源浪费。例如:
class Father(object):
def __init__(self, name):
self.name = name
print('father')
class Son1(Father):
def __init__(self, name, age):
self.age = age
Father.__init__(self, name)
print('Son1')
class Son2(Father):
def __init__(self, name, gender):
self.gender = gender
Father.__init__(self, name)
print('Son2')
class Grandson(Son1, Son2):
def __init__(self, name, age, gender):
Son1.__init__(self, name, age)
Son2.__init__(self, name, gender)
grand_son = Grandson('鬼子', 14, '男')
结果:
father
Son1
father
Son2
可见Father类的构造方法被执行了两次。此时用②super()方法来解决
②super()
class Mother(object):
def __init__(self, name):
print('Mother')
self.name = name
class Daughter1(Mother):
def __init__(self, name, age, *args):
print('Daughter1')
self.age = age
super(Daughter1, self).__init__(name, *args)
class Daughter2(Mother):
def __init__(self, name, gender):
print('Daughter2')
self.gender = gender
super(Daughter2, self).__init__(name)
class Granddaughter(Daughter1, Daughter2):
def __init__(self, name, age, gender):
print('Granddaughter')
super(Granddaughter, self).__init__(name, age, gender)
granddaughter = Granddaughter('狗剩', 24, '女')
结果:
Granddaughter
Daughter1
Daughter2
Mother
解决!!!
首先super首先获取self这个对象所在的类
然后可以通过类名.__mro__方法实现该类的继承列表
最后找到下一个继承的类,执行他的构造方法,依此类推,直到列表的最后一个类
最后注意:当传参导致参数无法实现对齐时,使用*args,**kwargs来补齐