python的多继承C3(mro)算法
2024-09-04 11:21:13
多继承的继承顺序按照C3算法进行顺序继承
例一
按照深度A类从左往右有三条可继承的"路"
先按照深度优先的算法,将每一路的每一个节点加到列表中
B = [B,D,F,H]
C = [C,E,G,H]
D = [D,F,H]
A = [B,C,D] A的广度顺序
得到四个列表,四个列表按照头尾的方式进行比较,如何划分头尾呢.
第一个为头,剩下的都是尾,
整体的算法介绍
比较第一个列表的头是都在其他列表中的尾部出现,如果出现,则跳过这个列表,直接到下一个列表的头部,再次判断是否出现在其他列表的尾部,如果都没有出现就将这个元素放进一个新的列表,
然后把所有列表中的这个元素删除,以此类推,直到把所有的列表删除为空,得出的新列表就是继承的顺序.
过程:
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D] new_list[B,]
第一次比较B,所有列表的尾部没有B,添加B到新列表,然后删除所有的头部B
2 [D,F,H] [C,E,G,H] [D,F,H] [C,D] new_list[B,]
比较头部D,D在其他的尾部中存在,跳过这次比较,直接进入下一个列表比较C
3 [D,F,H] [E,G,H] [D,F,H] [D] new_list[B,C]
C在其他列表的尾部不存在,将C添加至新列表,删除所有的头部C
4 [F,H] [E,G,H] [F,H] new_list[B,C,D]
再次回到第一个列表比较D,D没有存在其他列表的尾部添加D到新列表,然后删除所有的头部D
5 [H] [E,G,H] [H] new_list[B,C,D,F]
6 [H] [G,H] [H] new_list[B,C,D,F,E]
7 [H] [H] [H] new_list[B,C,D,F,E,G]
8 [] [] [] new_list[B,C,D,F,E,G,H] 所以最后的继承顺序就是A,B,C,D,F,E,G,H,object
例二
流程:因为有多个分叉,所以需要先计算每一个分叉的mro顺序:
从最左边的最高杈开始计算它的mro
分叉B:[B] [B,E](父类的, 按照深度优先) [B,D](自己继承的按照广度优先)
计算结果:[B,E,D]
分叉C:[C] [C,D] [C,F]
计算结果:[C,D,F]
计算完上面的两个叉后,就变成了一个叉.
再次进行计算:
[A] [B, E, D] [C, D, F] [B, C] new_list[A,]
[] [E, D] [C, D, F] [C] new_list[A,B,]
[] [D] [C, D, F] [C] new_list[A,B,E,]
[] [D] [D, F] [] new_list[A,B,E,C,]
[] [] [F] [] new_list[A,B,E,C,D,]
[] [] [] [] new_list[A,B,E,C,D,F]
所以最后的继承顺序就是A,B,E,C,D,F,object
最新文章
- tp框架获取常量信息、方法、命名空间
- jquery根据name属性查找
- 图解Javascript原型链
- 在网页中编辑报表的报表设计器Stimulsoft Reports Designer.Web报表控件
- java工程师分享:我是如何自学成才的?
- java Springmvc ajax上传
- 怎么通过IE连接本机oracle数据库
- C# 导出word文档及批量导出word文档(2)
- CMarkUp读写XML(转)
- 全站 HTTPS
- 常量指针(const X*)和指针常量(X* const)
- C# 网上收集的一些所谓的开源项目
- css3的apprearance属性(转)
- WPF中使用USERCONTROL
- Java 基础 程序流程控制 (上)
- spring框架的IOC的底层原理
- Centos7 Mysql5.7主从服务器配置
- uvm设计分析——field automation
- Linux命令:history
- 表迁移工具的选型-复制ibd的方法-传输表空间
热门文章
- 初次搭建spring boot 项目(实验楼-学习笔记)
- FastDFS 搭建
- 动态计算UITableViewCell高度详解 (转)
- Mysql慢查询 [第一篇]
- System.IO.IOException: The handle is invalid.
- 【起航计划 026】2015 起航计划 Android APIDemo的魔鬼步伐 25 App->;Notification->;Status Bar 状态栏显示自定义的通知布局,省却声音、震动
- Odoo (OpenERP/TinyERP)-10.0 (Debian 8)
- 去除Windows平台下每行代码的“^m”
- Computer Science: the Big Picture
- mongodb在C#的连接以及curd写法