多重继承和多继承, super, __mro__

2023-11-07

继承

(父类派生子类,子类继承父类)
通过继承,可以让子类去拥有父类中的属性和方法,而不必重新编写相同的代码,并且可以在父类的基础上添加新的属性和功能。

在继承的同时,子类还可以重写父类中的方法,从而获取与父类不同的功能,实现多态。

在 Python 中 所有的类都是存在继承关系的,没有显示继承的,都是默认继承 object 类
提高开发效率,避免代码冗余
#多重单继承初始化问题

class Person(object):   
    def __init__(self, name):          # <__main__.Son object at 0x7f95c505d630>
        self.__name = name
        print("Person init")

    def get_name(self):
        print(self.__name)


class Parent(Person):
    def __init__(self, name, age):      # <__main__.Son object at 0x7f95c505d630>
        Person.__init__(self, name)
        self.__age = age
        print("Parent init")

    def get_age(self):
        print(self.__age)


class Son(Parent):
    def __init__(self, name, age, gender):
        Parent.__init__(self, name, age)
        self.__gender = gender
        print("Son init")

    def get_gender(self):
        print(self.__gender)


wo = Son('tom', 22, 'male')
wo.get_name()
wo.get_age()
wo.get_gender()

>>>Person init
Parent init
Son init
tom
22
male

这里写图片描述
当在初始化时,子类只需要初始化自己扩展的属性即可,父类中的属性交给父类去初始化。

多重多继承的初始化问题

class Person(object):
    def __init__(self, name):
        self.__name = name
        print("Person init")

    def get_name(self):
        return self.__name


class Monther(Person):
    def __init__(self, name, job):
        Person.__init__(self, name)
        self.__job = job
        print("Monther init")

    def get_job(self):
        return self.__job


class Parent(Person):
    def __init__(self, name, age):
        Person.__init__(self, name)
        self.__age = age
        print("Parent init")

    def get_age(self):
        return self.__age


class Son(Parent, Monther):
    def __init__(self, name, age, job, gender):
        Parent.__init__(self, name, age)
        Monther.__init__(self, name, job)

        self.__gender = gender
        print("Son init")

    def get_gender(self):
        return self.__gender


wo = Son('tom', 22, 'teacher', 'male')
print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())

>>>Person init
Parent init
Person init
Monther init
Son init
tom 22 teacher male

很明显这是不对的,因为 Father 类和 Mother 类都是继承于 Person 类的,在自己的初始化方法中,执行了父类的初始化方法,所以执行了两次,造成了代码冗余
多重多继承 =》 person被调用多次 ==> object更多次

super 函数

super函数解决继承中父类被重复初始化问题

super函数的格式

super(CurrentClassName, self).init(*args, **kwargs)

class Person(object):
    def __init__(self, name):
        self.__name = name
        print("Person init")

    def get_name(self):
        return self.__name


class Mother(Person):
    def __init__(self, job, *args):
        super(Mother, self).__init__(*args)
        self.__job = job
        print("Mother init")

    def get_job(self):
        return self.__job


class Father(Person):
    def __init__(self, age, *args):
        super(Father, self).__init__(*args)
        self.__age = age
        print("Father init")

    def get_age(self):
        return self.__age


class Son(Father, Mother):
    def __init__(self, name, age, job, gender):
        super(Son, self).__init__(name, age, job)
        self.__gender = gender
        print("Son init")

    def get_gender(self):
        return self.__gender


wo = Son('tom', 22, 'teacher', 'male')
print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())

>>>Person init
Mother init
Father init
Son init
teacher tom 22 male

通过执行结果来看,使用 super 改进后的代码只初始化了一次 Person 的初始化方法。

###钻石继承
这里写图片描述

##mro
mro Method Resolution Order 方法解析顺序

在类出现继承时,每个类中都会保存一个当前类的继承关系的表。

super 函数在执行时,会在自己保存的这个继承关系中去查找第一个参数,也就是当前的类名的下一个类是谁。然后去调用下个类的初始化方法。

Python 中使用广度优先算法来决定继承关系的排序
这里写图片描述

Mro顺序

print(Son.__mro__)

>>>(<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.Person'>, <class 'object'>)

在初始化父类时,也可以使用 super().init() 函数来调用,简化super函数的写法。

这时,super函数中没有参数,还是能正确执行,就是依照 mro 中的顺序来执行的。

super().__init__(*args)

对象在调用方法时,也会依照这个顺序来查找方法。

类在继承时,继承关系的书写顺序会影响 mro 中的顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多重继承和多继承, super, __mro__ 的相关文章

随机推荐

  • jsp调用controller方法_SpringMVC五大核心组件及调用过程

    Spring Web MVC 五大核心组件 DispatcherServlet 控制器入口 负责分发请求 HandlerMapping 负责根据请求 找到对应的控制器 Controller 真正处理请求的控制器 ModelAndView 封
  • 用于光栅仿真的非偏振光–实例讨论

    摘要 像光栅这样的光学设备对光的偏振比较敏感 因此 在仿真中适当考虑光的偏振非常重要 在实际中 光栅有时会以非偏振光作为输入 作为两个正交偏振态的平均值 我们为您展示了如何在VirtualLab Fusion中建模这种用于光栅仿真的非偏振光
  • C语言《文件操作》事无巨细,保姆级介绍,通俗易懂

    目录 1 文件名与文件分类 2 文件操作使用 2 1文件的打开与关闭 3 文件操作函数 3 1其他文件函数 1 fseek 2 ftell 3 rewind 4 文件结束的判定 4 1被错误使用的 feof 4 2文件结束的正确判断 5 文
  • negix安装部署

    1 从nginx官网下载Nginx wget http nginx org download nginx 1 8 1 tar gz 2 解压Nginx tar zxvf nginx 1 8 1 tar gz 3 初始化配置 configur
  • OpenCV(3.4.1) Error: Assertion failed (scn == 3

    错误 OpenCV 3 4 1 Error Assertion failed scn 3 scn 4 in cv cvtColor file D Build OpenCV opencv 3 4 1 modules imgproc src c
  • vi的一些操作

    1 u可撤销操作 2 yy复制当前行 3 p粘贴复制的行 4 dd删除一行 5 xxx可以定位xxx所在位置 6 n或ngg或nG可以跳转到第n行 以下设置是临时的 只在当前vi中生效 但可将其添加在配置文件 etc virc中使每次按文件
  • STM32CubeMX的使用教程

    STM32 关于STM32CubeMX的使用 打开Cube 点击File New Project 搜索芯片型号这边选择的是STM32L071CB系列上面菜单Docs Resources可以下载数据手册程序手册等 点击Start Projec
  • DEBUG:only Tensors of floating point dtype can require gradients

    DEBUG only Tensors of floating point dtype can require gradients 解决 x V t arange 2 4 float requires grad True
  • 4_hytrix_信号量_线程池

    文章目录 Hystrix 核心特性和原理 使用 单独使用 整合 Feign 整合RestTemplate 信号量与线程隔离 线程池隔离 信号量隔离 常用配置 hystrix 使用dashboard Hystrix 核心特性和原理 熔断 连续
  • C strtok strtok_s 函数说明 按分隔符分解字符串

    1 说明 1 1 函数签名如下 char strtok char str const char delimiters 1 str 要被分解成一组小字符串的字符串 2 delimiters 包含分隔符的 C 字符串 1 2 返回值 该函数返回
  • DPDK的PMD(uio/igb_uio/vfio-pci/uio_pci_generic)

    目录 linux收包的方式 中断对性能的影响有多大 轮询对性能的提升有多大 PMD 介绍 收包对比 内核收包的弊端 DPDK 收包的优点 uio igb uio uio pci generic vfio pci igb uio IGB UI
  • MATLAB算法实战应用案例精讲-【集成算法】集成学习模型stacking(附Python和R语言代码)

    目录 前言 几个高频面试题目 1 哪种集成技术更优 什么情况下选择哪种集成技术呢
  • Java多线程技术详解(全都是细节!)

    多线程启动 线程有两种启动方式 实现Runnable接口 继承Thread类并重写run 方法 1 Thread 与 Runnable Runnable接口表示线程要执行的任务 当Runnable中的run 方法执行时 表示线程在激活状态
  • fisco bcos用caliper0.2.0进行压力测试的安装配置

    一 前期环境 1 硬件 需要外网权限 2 操作系统 版本要求 Ubuntu gt 16 04 CentOS gt 7 MacOS gt 10 14 3 基础软件 python 2 7 make g gcc git sudo apt inst
  • 中医处方软件_重磅上线:中医传承计算平台V3.0正式推出

    重要小贴士 为进一步提高期刊论文质量和水平 更为深度的传承和传播名医经验 中医传承计算平台研发团队联合中药大品种联盟将于2020年7月24 26日在贵阳举办中医药科研论文与SCI写作培训会议 该培训班围绕名医学术思想 经验总结 毕业论文设计
  • win10下MYSQL的下载、安装以及配置超详解教程~~小白入

    下载MYSQL 官网下载MYSQL5 7 21版本 链接地址https www mysql com downloads 下载流程图如下 进入官网点击Community 下载社区版 找到MYSQL Community Server 点击下方D
  • 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式

    一 系统吞度量要素 一个系统的吞度量 承压能力 与request对CPU的消耗 外部接口 IO等等紧密关联 单个reqeust 对CPU消耗越高 外部系统接口 IO影响速度越慢 系统吞吐能力越低 反之越高 系统吞吐量几个重要参数 QPS T
  • stm32 GPIO输入输出

    GPIO 通用输入输出口 可配置为8种输入输出模式 输出模式下可控制端口输出高低电平 用以驱动LED 控制蜂鸣器 模拟通信协议输出时序等 输入模式下可读取端口的高低电平和电压 用于读取按键输入 外接模块电平信号输入 ADC电压采集 模拟通信
  • qt中实现绘制图形与截图

    引言 实现可以选择线型 线宽 颜色 是否填充图形来绘制各种常见的图形 同时可以选择矩形区域来实现截图 效果 绘图的效果如上 截图的效果 实现 项目使用的qt5 13 2 编译器为MSVC2017 64bit 该项目是基于基类QWidget创
  • 多重继承和多继承, super, __mro__

    继承 父类派生子类 子类继承父类 通过继承 可以让子类去拥有父类中的属性和方法 而不必重新编写相同的代码 并且可以在父类的基础上添加新的属性和功能 在继承的同时 子类还可以重写父类中的方法 从而获取与父类不同的功能 实现多态 在 Pytho