当继承的时候遇到这种情况:定义一个类,多个类继承了这个类,接着再定义一个类,他继承了这多个类。
如:
类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来补齐