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的运用
-------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...
随机推荐
- 【LeetCode】1001. Grid Illumination 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 哈希 日期 题目地址:https://leetcod ...
- 【LeetCode】355. Design Twitter 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Docker 与 K8S学习笔记(九)—— 容器间通信
容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...
- 为什么我的 WordPress 网站被封了?
今年以来,一系列 "清朗" "护苗" "净网" 专项整治行动重拳出击,"清朗·春节网络环境"取消备案网站平台2300余家 ...
- 【环境搭建】安装pyQt5 在pycharm报This application failed to start because no Qt platform plugin could be initialized的问题
报错:This application failed to start because no Qt platform plugin could be initialized 解决办法: http:// ...
- 「双串最长公共子串」SP1811 LCS - Longest Common Substring
知识点: SAM,SA,单调栈,Hash 原题面 Luogu 来自 poj 的双倍经验 简述 给定两字符串 \(S_1, S_2\),求它们的最长公共子串长度. \(|S_1|,|S_2|\le 2. ...
- [opencv]统计每个像素值的数目
int histo[256] = { 0 };//直方图统计每个像素值的数目 int width = img.cols, height = img.rows; int num_of_pixels = ...
- redis-ha手动切换slave节点为master
仅做个人记录,请慎重参考!! 问题描述:使用redis-ha启动了3个pod,现在还有一个pod正常运行,并且为slave(理论上第一个起来的pod应该为master) 通过info命令查看下图 尝试 ...
- 图解MongoDB集群部署原理(3)
MongoDB的集群部署方案中有三类角色:实际数据存储结点.配置文件存储结点和路由接入结点. 连接的客户端直接与路由结点相连,从配置结点上查询数据,根据查询结果到实际的存储结点上查询和存储数据.Mon ...
- CSS基础-5 伪类
一.伪类 我们以a标签为例 伪类标签分为4类 1. 设置超链接默认的样式 a:link {属性:值;.....} 或者 a { 属性: 值;} 推荐使用这种方式 2 ...