python面向对象3(钻石继承的问题,多继承的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来补齐

阅读更多
个人分类: 基础语法
上一篇内存地址存储,内存空间
下一篇上下文管理器(Context Manager)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭