• 多继承的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来补齐

  • 相关阅读:
    前端,DJ
    打印九九乘法表
    求数组中最大值和最小值
    求数组中最大值和次大值
    数据库 Mysql 使用,优化,索引
    List、Map、Set的区别与联系
    1001个整数,每个数范围1到1000,求出重复的数字。
    一个正整数是否等于因数之和
    滑动验证 和滑动图片验证JS
    cmd中mvn命令,出现No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
  • 原文地址:https://www.cnblogs.com/waterstar/p/11320909.html
Copyright © 2020-2023  润新知