多继承的super用法

当继承的时候遇到这种情况:定义一个类,多个类继承了这个类,接着再定义一个类,他继承了这多个类。

如:

                                    类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来补齐

猜你喜欢

转载自www.cnblogs.com/waterstar/p/11320909.html