在python的多继承中,父类的初始化顺序遵循所谓方法解析顺序(Method Resolution Order,MRO)的机制。python使用C3线性化算法来确定多继承类的MRO:

  1. 目标:创建一个一致的线性继承顺序,同时保持父类的相对顺序和子类优先原则。

  2. 子类优先:子类总是在其父类之前出现。从而子类可以重写父类的方法或属性。

  3. 从左到右的顺序:在多继承类时,指定的父类顺序决定了它们在 MRO 中的优先级,会首先查找靠左的父类中的方法或属性。

  4. 每个类只处理一次:确保在复杂的继承体系中,每个类的方法或属性只被考虑一次。

  关于如下代码:

class Base1:
def __init__(self, a):
self.a = a
print("Base1 initialized", a) class Base2:
def __init__(self, a):
self.a = a
print("Base2 initialized", a) class Child(Base1, Base2):
def __init__(self, a=1, b=2):
super(Child, self).__init__(a)
super(Base1, self).__init__(b)
# Base1.__init__(self, a)
# Base2.__init__(self, b) c = Child()

  其中Child类多继承了Base1和Base2,而Base2和Base2都需要传入一个参数。代码中列举了两种方式来初始化Child类:

  super:super(class, self).__init__(a)通过MRO的顺序找到class在MRO中的下一个类来进行初始化。比如以上代码中的super(Child, self).__init__(a),实际上是对Base1进行初始化,并保存到self中。super().__init__(a)与super(Child, self).__init__(a)效果相同。由于其中Base2是Base1在MRO中的下一个类,因此super(Base1, self).__init__(b)是将b传入Base2对其进行初始化,并加载到self中。

  显式初始化:文中注释的代码class.__init__(self, a),通过显式的方式对父类class进行初始化,此时Base1.__init__(self, a)就是将a传入Base1对其进行初始化。这种方式相较于super更容易理解,但需要自行控制好初始化的顺序。此外,这种方式可以无需把父类写在子类的类名括号中,也能实现对父类方法和属性的继承。当然这实际上等于复制了父类的属性和方法,而并没有继承的关系,从而不能利用到继承关系的一些python特性,如isinstance()方法的调用等。

  要查看某个类的MRO,可使用class.__mro__。

python中的多继承理解的更多相关文章

  1. python中对多态的理解

    目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...

  2. python中使用多继承

    python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...

  3. Python中的单继承与多继承实例分析

    Python中的单继承与多继承实例分析 本文实例讲述了Python中的单继承与多继承.分享给大家供大家参考,具体如下: 单继承 一.介绍 Python 同样支持类的继承,如果一种语言不支持继承,类就没 ...

  4. 对python中元类的理解

    1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...

  5. python 中的super()继承,搜索广度为先

    一.python中类的继承 1.1 单继承 在python 中我们可以这样来定义一个类:及继承它的子类 class Father: def __init__(self, mes): #1 父类的ini ...

  6. Python中“if __name__=='__main__':”理解与总结

    1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...

  7. 对于Python中回调函数的理解

    关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...

  8. Python中的strip()的理解

    在看到Python中strip的时候产生了疑问 strip() 用于移除字符串头尾指定的字符(默认为空格) 开始测试: >>> s = 'ncy_123.python' >&g ...

  9. 对python中的__name__的理解

    一开始学习python的时候,不理解python中的__name__的用途,一致感觉__name__的返回结果就是__main__ 今天系统的看了一下,才理解过来,__name__真正的用处是用在使用 ...

  10. python 中is和== 的理解

    Python中的对象包含三要素:id.type.value其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值is判断的是a对象是否就是b对象,是通过id来判断的==判断的是a对 ...

随机推荐

  1. Java并非锁之独占非公平锁理解

    Java锁系列教程之独占式锁 在Java并发编程中,锁是一个很重要的对象.Java中锁有两种:隐式锁和显式锁.使用synchronized关键字的锁是隐式锁.因为锁的申请和释放都是由JVM来维护的,不 ...

  2. python pyqt6 QMenu 设定圆角边框

    本来这个没有必要写,但是因为写的过程中,按照网上的写法运行,不知道为什么QMenu的右下角有圆角边框与直角背景颜色会覆盖显示 所以还是有必要写一下 menu = QMenu(self.tool_but ...

  3. 修改SpringBoot的配置文件application.yaml后启动失败

    经常碰到修改application.yaml文件之后,SpringBoot项目启动失败的,报错信息如下 Connected to the target VM, address: '127.0.0.1: ...

  4. 利用CSS 实现环形百分比进度展示

    先看效果图: UI设计了这样的效果,已读人数占总人数的百分比,环形展示. 这里可以用echarts图表,也可以用css实现,因为我是在小程序环境下,考虑到包大小体积,采用了css实现. 核心就是一行代 ...

  5. vue springboot 实现excel导出

    实现excel 导出 一.需求 实现 excel 的导出 二.技术 选用 easypoi 官网: https://gitee.com/lemur/easypoi#http://doc.wupaas.c ...

  6. fluent python-chap3-1

    class collections.OrderedDict([items]) 返回一个 dict 子类的实例,它具有专门用于重新排列字典顺序的方法. """ move_t ...

  7. Angular 18+ 高级教程 – Coding Style Guide 编码风格

    前言 Angular 从 v14 开始大改特改,改最多的就是编码风格. 以前是 class first,Decorator first,mutable first. 现在变成了 function fi ...

  8. EF Core – Unit of Work, DbContext, Transaction 概念解释

    前言 踩了一个坑, 下面是 2 个 scope 的调用, 第 1 和 3 是一个 Audit log filter action, 第 2 个是 controller. // open tran // ...

  9. bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕)

    机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 \(1.6\) 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 \(N\tim ...

  10. 【ZZ】Linux 安装 edge 浏览器

    For Debain/Ubuntu/Deepin etc.## Setupcurl https://packages.microsoft.com/keys/microsoft.asc | gpg -- ...