首页 > 编程语言 >Python中mro继承顺序查询之C3算法

Python中mro继承顺序查询之C3算法

时间:2022-12-02 17:23:35浏览次数:48  
标签:第一个 merge Python 元素 序列 mro C3 第二个

1. mro遍历顺序

  1. python中存在多继承:A同时继承B和C,B继承E,C继承F,E和F最终继承object,如果我们访问A的实例对象的属性,他的查找方法遵循C3算法,(之前是深度优先查询,一条路走到底)

    深度优先算法:

    

 

 

 

2. C3算法

  1. 公式:mro(A) = [A] + merge(mro(B),mro(C),[B,C])

  2. merge的意思是合并,如果一个序列的第一个元素,是其他序列中的第一个元素,或不在其他序列出现,则从所有执行merge操作序列中删除这个元素,合并到当前的mro中。merge操作后的序列,继续执行merge操作,直到merge操作的序列为空。如果merge操作的序列无法为空,则说明不合法。

以实例代码为例:
        第一步:mro(A) = [A] + merge([B,E,O],[C,F,O],[B,C]),看merge中第一个序列的第一个元素B,不存在其他序列的第二个元素起,合并进列表
        第二步:mro(A) = [A,B] + merge(E,O],[C,F,O],[C]),看merge中第一个序列的第一个元素E,不存在其他序列的第二个元素起,合并进列表
        第三步:mro(A) = [A,B,E] + merge([O],[C,F,O],[C]),看merge中第一个序列的第一个元素O,存在其他序列的第二个元素起,跳过
        第四步:mro(A) = [A,B,E] + merge([O],[C,F,O],[C]),看merge中第二个序列的第一个元素C,不存在其他序列的第二个元素起,合并进列表
        第五步:mro(A) = [A,B,E] + merge([O],[F,O],[C]),看merge中第一个序列的第一个元素O,存在其他序列的第二个元素起,跳过
        第六步:mro(A) = [A,B,E,C] + merge([O],[F,O],[]),看merge中第二个序列的第一个元素F,不存在其他序列的第二个元素起,合并进列表
        第七步:mro(A) = [A,B,E,C,F] + merge([O],[O],[]),看merge中第一个序列的第一个元素O,不存在其他序列的第二个元素起,合并进列表
        第八步:mro(A) = [A,B,E,C,F,O],通过C3算法得到遍历顺序

  
# 代码展示
class E: pass class F: pass class B(E): pass class C(F): pass class A(B,C): pass
# [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class 'object'>] print(A.mro()) print(B.mro()) # [<class '__main__.B'>, <class '__main__.E'>, <class 'object'>] print(C.mro()) # [<class '__main__.C'>, <class '__main__.F'>, <class 'object'>]

 

 

标签:第一个,merge,Python,元素,序列,mro,C3,第二个
From: https://www.cnblogs.com/chf333/p/16944851.html

相关文章

  • python之gRPC初试
    目录前言准备安装示例编写proto文件通过proto文件生成_pb2.py和_pb2_grpc.py文件编写server文件编写client文件运行结语前言本文章作为初学gRPC的一个记录,主要参考文档:Qu......
  • Python高级-元类-笔记
    1.类也是对象在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:>>>classObjectCreator(object):…pass…>>>my_object......
  • Python高级-元类实现ORM-笔记
    1.ORM是什么ORM是python编程语言后端web框架Django的核心思想,“ObjectRelationalMapping”,即对象-关系映射,简称ORM。一个句话理解就是:创建一个实例对象,用创建它的类名......
  • Python——将PPT和Word转为PDF文件
    前言通过win32com.client将PPT和Word文件转为PDF格式内容importfitz#pipinstallpymupdfimportwin32com.clientimportosdefppt2pdf(filename,output_file......
  • python3使用matplotlib和seaborn生成带有扰动点的箱型图
    importcsvimportseabornassnsimportmatplotlib.pyplotasplt#解决中文不显示和负号不显示问题rc={'font.family':'MicrosoftYaHei','axes.unicode_......
  • 算法工程师资料分享(算法基础 推荐算法 编程 python java c++ shell sql 数据结构 竞
    关注公众号:后厂村搬砖工。回复:学习资料汇总即可领取目录一、算法基础1.1学习路线1.2学习资料推荐二、编程能力2.1Python编程2.2Java编程2.3C++编程2.4Shell......
  • vscode的python3代码格式化问题
    #安装python插件在vscode的Extensions模块中搜索python 安装python扩展打开settings设置,搜索python.linting.enabled设置python.linting.enabled为true搜索pyt......
  • python3读写excel之xlrd和xlwt
    最新要处理excel文件,于是整理了下python3中常用操作excel的包的用法pip用法#查看已安装piplist#安装包pipinstallxlrd#安装指定版本pipinstallxlrd==1.2.......
  • python3读写excel之openxlpy
    pipinstallopenpyxl openpyxl读写xlsx文件,不处理xls文件importopenpyxlimportlocaleimportdatetimeimporttimeimportos#读xlsx文件excel=o......
  • Python3 数据结构
    Python处理大数据集可以借助Python内置数据结构:列表、元组、字典、集合等,但是一般要和pandas和Numpy等库结合起来使用。熟练掌握Python,首先就是熟练掌握Python的数......