python多继承下的查找顺序-MRO原则演变与C3算法
在python历史版本中的演变史
python2.2之前:
MRO原则:
只有经典类,遵循深度优先(从左到右)原则,
存在的问题:在有重叠的多继承中,违背重写可用原则
解决办法是再设计类的时候不要设计这样有问题的类
python2.2版本:
MRO原则:
经典类:遵循深度优先(从左到右)原则
引入新式类:在深度优先(从左到右)的算法基础之上, 优化了一部分,如果产生重复元素, 会保留最后一个,并且, 更尊重基类出现的先后顺序
新式类存在的问题:无法检测出有问题的继承,
有可能还会违背局部优先的原则
例如:

python2.3-2.7版本:
MRO原则:
经典类:遵循深度优先(从左到右)原则
新式类:C3算法
python3.x之后:MRO原则:
只有新式类:C3算法
C3算法详解:
公式:
L(object) = [ object ]
L(子类(父类1,父类2)) = [ 子类 ] + merge(L(父类1) + L(父类2) + [父类1,父类2])
注意:+ 代表合并列表
mergel算法:
1、第一个列表中的第一个元素如果是后面列表中的首个元素或者在后面列表中不存在,则将这个元素合并到merge函数前面的最终列表中,并删除这个元素
2、如果第一个列表第一个元素不成立,则查看第二个列表首个元素,执行第1步操作
3、如果最终无法把所有元素都归到最终的解析列表中,则报错,说明是错误的继承关系
案列代码:
class D(object):
# pass # L(D(object)) = [D] + merge(L(object), [object])
# = [D] + merge([object], [object])
# = [D, object] + merge([], [])
# = [D, object] # class B(D):
# pass # L(B(D)) = [B] + merge(L(D), [D])
# = [B] + merge([D, object], [D])
# = [B, D] + merge([object], [])
# = [B, D, object] + merge([], [])
# = [B, D, object] # class C(D):
# pass
# L(C(D)) = [C, D, object] # class A(B, C):
# pass
# L(A) = [A] + merge(L(B), L(C), [B, C])
# = [A] + merge([B, D, object], [C, D, object], [B, C])
# = [A, B] + merge([D, object], [C, D, object], [C])
# = [A, B, C] + merge([D, object], [D, object])
# = [A, B, C, D] + merge([object], [object])
# = [A, B, C, D, object] + merge([], [])
# = [A, B, C, D, object]
查看继承顺序的方法
1、import inspect
print(inspect.getmro(类))
2、类.mro()
类.__mro__()
python多继承下的查找顺序-MRO原则演变与C3算法的更多相关文章
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...
- day 24 面向对象之继承及属性查找顺序
组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def init(self, name, age): self.name = name self.age = age t1 ...
- 【Windows下DLL查找顺序 】
一.写作初衷 在Windows下单个DLL可能存在多个不同的版本,若不特别指定DLL的绝对路径或使用其他手段指定,在应用程序加载DLL时可能会查找到错误的版本,进而引出各种莫名其妙的问题.本文主要考虑 ...
- super之mro列表牵引出c3算法
目录 一:super的使用 二:super之mro列表牵引出c3算法 三:mro列表总结使用 一:super的使用 class Person(object): def __init__(self, n ...
- python面向编程:类继承、继承案例、单继承下属性查找、super方法
一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...
- 类和实例属性的查找顺序 mro查找
如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用 mro方法 例如: class A: pass class C(D): pass class B(D): pass class A(B, ...
- Windows下DLL查找顺序
目录 第1章说明 2 1.1 查找顺序 2 1.1.1 检查DllCharacteristics字段 3 1.1.2 读取manifset资源 3 1.1.3 读取manifs ...
- 【实测】Python 和 C++ 下字符串查找的速度对比
完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...
- Python实现Linux下文件查找
import os, sys def search(curpath, s): L = os.listdir(curpath) #列出当前目录下所有文件 for subpath in L: #遍历当前目 ...
随机推荐
- nginx反向代理本地 单台wed -使用ip+端口代理
环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...
- Core Data概述(转)
Core Data是一个模型层的技术.Core Data帮助你建立代表程序状态的模型层.Core Data也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data不 ...
- Outlook2016中如何实现自动密送
Outlook2016中如何实现自动密送 下面的方案您可以参考一下: 1)在Outlook里面键入Alt+F11打开VBA编辑器: 2)激活左边的工程面板,展开并双击上面的“Project (VbaP ...
- utgard OPC 主要功能简介
度娘还行,尽管不好用,但所有的开发人员不懈努力地写博客,能得到很多东西! 这里向所有未谋面的博主们致敬! 搜了一堆OPC资料,在这里整理一下,用一个封装类来说明utgard的主要接口.使用了java自 ...
- PJzhang:ms17-010永恒之蓝漏洞在windows 2008R2中的复现
猫宁!!! 参考: https://www.anquanke.com/post/id/86245 https://xz.aliyun.com/t/2536 https://www.cnblogs.co ...
- php代码调试的重要性
从去年开始做PHP,基本上有的集成环境用了一个遍,XAMPP,WAMP,phpStudy.都是部署一个环境,就在环境下的默认访问目录去创建项目运行.用PHPStorm一直没能在本地做过什么调试.要么不 ...
- 36.HTTP协议
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- Docker daemon.json 的配置项目合集
这几天看了一点docker相关的东西, 在学习中: 看了下园友的blog 感觉很好 这里 学习一下. https://www.cnblogs.com/pzk7788/p/10180197.html 其 ...
- Django-filter报错:__init__() got an unexpected keyword argument 'name'
原因是 自从 django-filter2.0之后 将Filter的name字段 更名为 field_name 所以需要这样写: class GoodsFilter(filters.FilterSet ...