zoukankan      html  css  js  c++  java
  • 多继承的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来补齐

  • 相关阅读:
    [原创]Android中LocationManager的简单使用,获取当前位置
    Android远程图片获取和本地缓存
    Android wakelock机制
    android上的缓存、缓存算法和缓存框架
    052 自动将每日的日志增量导入到hive中
    051 日志案例分析(PV,UV),以及动态分区
    050 sqoop的使用
    049 CDH商业版本的搭建(hadoop5.3.6 +hive+sqoop)
    000 Python的运行
    048 hive运行的相关配置
  • 原文地址:https://www.cnblogs.com/waterstar/p/11320909.html
Copyright © 2011-2022 走看看