super之mro列表牵引出c3算法
一:super的使用
class Person(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class Student(Person):
def __init__(self, name, age, sex):
super().__init__(name, age, sex) python3中的写法 表示调用父辈的__init__, 完成初始化
self.score = 0
lisi = Student('李四', 20, '女')
print(lisi.name)
注:
python2写法 表示调用父辈的__init__, 完成初始化
super(Student, self).__init__(name, age, sex)
指名道姓的调用父类的方法 跟继承没有关系 调用类中的__init__函数,完成对self的初始化
Person.__init__(self, name, age, sex)
python3中的写法 表示调用父辈的__init__, 完成初始化
super().__init__(name, age, sex)
二:super之mro列表牵引出c3算法
print(C.__mro__)
结果:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
class A:
def test(self):
print('from A.test')
super().test() ————》到B--->object c3线性算法
class B:
def test(self):
print('from B')
class C(A, B):
pass
c = C()
c.test() 结果: from A.test from B
牵扯到mro列表
print(C.__mro__)
结果:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
顺序 c3线性算法
为了实现继承,python会在mro列表从左往右开始查找基类,直到找到第一个匹配这个属性的类为止
而这个mro列表是通过一个c3线性算法来实现的,我们不去深究这个算法的数学原理,它实际上就是合并所以父类的mro列表并遵循如下三条
1.子类会先余父类被检查
2.多个父类会根据他们在列表的顺序被检查
3.如果对下一个类存在两个合法选择,选择第一个父类

三:mro列表总结使用
1.到我们碰倒super 难以分析
使用print(C.mro())
打印查找顺序:[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
获取super的顺序流程
class B:
def test(self):
print('B---->test')
def aaa(self):
print('B---->aaa')
class A:
def test(self):
print('A---->test')
super().aaa()
class C(A, B):
def aaa(self):
print('C----->aaa')
c = C()
c.test() 打印结果: 'A---->test B---->aaa
print(C.mro()) 打印查找顺序:[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
super之mro列表牵引出c3算法的更多相关文章
- python多继承下的查找顺序-MRO原则演变与C3算法
在python历史版本中的演变史 python2.2之前: MRO原则: 只有经典类,遵循深度优先(从左到右)原则, 存在的问题:在有重叠的多继承中,违背重写可用原则 解决办法是再设计类的时候不要设计 ...
- 子类中执行父类的方法(引出super()与mro列表)
1. 我们先想一下在python中如果子类方法中想执行父类的方法,有什么方式?大概有三种: Parent.__init__(self, name) # 通过父类的名字,指定调用父类的方法 super( ...
- python学习笔记:第20天 多继承、MRO C3算法
目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...
- C3算法 和 super
一. Python的继承 多继承 子类继承父类. 继承是为了节省开发时间.提高开发效率 代码得到了重(chong)用 一个类可以拥有多个父类 lass shen_xian: # 定义一个神仙类 de ...
- python小兵 面向对象继承super和c3算法
python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...
- MRO和C3算法
本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO,C3算法 4.super() 一.python多继承 在python中类与类之间可以有继承关系, ...
- Python-MRO和C3算法
一. python多继承 在前面的学习过程中,我们已经知道了python中类与类之间可以有继承关系,当出现x是一种y的时候就可以使用继承关系.即'is-a'关系,在继承关系中子类自动拥有父类中除了私有 ...
- day19 MRO C3算法 super()
1. MRO(Method Resolution Order):方法解析顺序,主要用于在多继承时判断调的属性的路径(来自于哪个类). 1.Python语言包含了很多优秀的特性,其中多重继承就是其中之一 ...
- MRO C3算法 super的运用
-------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...
随机推荐
- c++内存分布之虚析构函数
关于 本文代码演示环境: VS2017+32程序 虚析构函数是一种特殊的虚函数,可以知道,虚函数影响的内存分布规律应该也适用虚析构函数.看看实际结果. Note,一个类中,虚析构函数只能有一个. 本文 ...
- 【LeetCode】665. 非递减数列 Non-decreasing Array(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:数组,array,非递减,遍历,python,C++ 目录 题目描述 题目大意 解题方法 一.错误代码 二.举例分析 ...
- 【LeetCode】881. Boats to Save People 解题报告(Python)
[LeetCode]881. Boats to Save People 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...
- 【LeetCode】385. Mini Parser 解题报告(Python)
[LeetCode]385. Mini Parser 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/mini-parser/ ...
- hdu-5569matrix(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=5569; 题目意思: 从(1,1)点出发只能向右和向下走,到达(n,n)点时所得到的价值最小, 价值是Let th ...
- Myeclipse查看jdk源代码
过程如下: 1.点 "window"-> "Preferences" -> "Java" -> "Install ...
- RTD2172方案|TYPEC转HDMI2.0转换器芯片|CS5265替代RTD2172
RTD2172 USB Type-C到HDMI转换器结合了USB Type-C输入接口和数字高清多媒体接口(HDMI)输出.嵌入式微控制器(MCU)基于工业标准8051内核.接收器端口将信道配置(CC ...
- 【MySQL作业】sum、max 和 min 聚合函数——美和易思聚合函数应用习题
点击打开所使用到的数据库>>> 1.统计商品最高单价和最低单价. -- 获取所有商品的最高单价和最低单价: select max(unitPrice) 最高单价 , min(unit ...
- 最小生成树Kruskal算法(1)
概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. [1] 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆) ...
- TYPESCRIPT中文教程基础部分下----翻译自TS官方
type 别名 我们已经使用过 object 和 联合的方式 直接声明类型.但是某个类型在使用多次的情况下就要用到别名了. 别名的语法就像是在定义一个具名的对象一样: type Point = { x ...