python中的多继承理解
在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中的多继承理解的更多相关文章
- python中对多态的理解
目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...
- python中使用多继承
python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...
- Python中的单继承与多继承实例分析
Python中的单继承与多继承实例分析 本文实例讲述了Python中的单继承与多继承.分享给大家供大家参考,具体如下: 单继承 一.介绍 Python 同样支持类的继承,如果一种语言不支持继承,类就没 ...
- 对python中元类的理解
1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...
- python 中的super()继承,搜索广度为先
一.python中类的继承 1.1 单继承 在python 中我们可以这样来定义一个类:及继承它的子类 class Father: def __init__(self, mes): #1 父类的ini ...
- Python中“if __name__=='__main__':”理解与总结
1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...
- 对于Python中回调函数的理解
关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...
- Python中的strip()的理解
在看到Python中strip的时候产生了疑问 strip() 用于移除字符串头尾指定的字符(默认为空格) 开始测试: >>> s = 'ncy_123.python' >&g ...
- 对python中的__name__的理解
一开始学习python的时候,不理解python中的__name__的用途,一致感觉__name__的返回结果就是__main__ 今天系统的看了一下,才理解过来,__name__真正的用处是用在使用 ...
- python 中is和== 的理解
Python中的对象包含三要素:id.type.value其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值is判断的是a对象是否就是b对象,是通过id来判断的==判断的是a对 ...
随机推荐
- Java并非锁之独占非公平锁理解
Java锁系列教程之独占式锁 在Java并发编程中,锁是一个很重要的对象.Java中锁有两种:隐式锁和显式锁.使用synchronized关键字的锁是隐式锁.因为锁的申请和释放都是由JVM来维护的,不 ...
- python pyqt6 QMenu 设定圆角边框
本来这个没有必要写,但是因为写的过程中,按照网上的写法运行,不知道为什么QMenu的右下角有圆角边框与直角背景颜色会覆盖显示 所以还是有必要写一下 menu = QMenu(self.tool_but ...
- 修改SpringBoot的配置文件application.yaml后启动失败
经常碰到修改application.yaml文件之后,SpringBoot项目启动失败的,报错信息如下 Connected to the target VM, address: '127.0.0.1: ...
- 利用CSS 实现环形百分比进度展示
先看效果图: UI设计了这样的效果,已读人数占总人数的百分比,环形展示. 这里可以用echarts图表,也可以用css实现,因为我是在小程序环境下,考虑到包大小体积,采用了css实现. 核心就是一行代 ...
- vue springboot 实现excel导出
实现excel 导出 一.需求 实现 excel 的导出 二.技术 选用 easypoi 官网: https://gitee.com/lemur/easypoi#http://doc.wupaas.c ...
- fluent python-chap3-1
class collections.OrderedDict([items]) 返回一个 dict 子类的实例,它具有专门用于重新排列字典顺序的方法. """ move_t ...
- Angular 18+ 高级教程 – Coding Style Guide 编码风格
前言 Angular 从 v14 开始大改特改,改最多的就是编码风格. 以前是 class first,Decorator first,mutable first. 现在变成了 function fi ...
- EF Core – Unit of Work, DbContext, Transaction 概念解释
前言 踩了一个坑, 下面是 2 个 scope 的调用, 第 1 和 3 是一个 Audit log filter action, 第 2 个是 controller. // open tran // ...
- bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕)
机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 \(1.6\) 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 \(N\tim ...
- 【ZZ】Linux 安装 edge 浏览器
For Debain/Ubuntu/Deepin etc.## Setupcurl https://packages.microsoft.com/keys/microsoft.asc | gpg -- ...