多继承的继承顺序按照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

最新文章

  1. tp框架获取常量信息、方法、命名空间
  2. jquery根据name属性查找
  3. 图解Javascript原型链
  4. 在网页中编辑报表的报表设计器Stimulsoft Reports Designer.Web报表控件
  5. java工程师分享:我是如何自学成才的?
  6. java Springmvc ajax上传
  7. 怎么通过IE连接本机oracle数据库
  8. C# 导出word文档及批量导出word文档(2)
  9. CMarkUp读写XML(转)
  10. 全站 HTTPS
  11. 常量指针(const X*)和指针常量(X* const)
  12. C# 网上收集的一些所谓的开源项目
  13. css3的apprearance属性(转)
  14. WPF中使用USERCONTROL
  15. Java 基础 程序流程控制 (上)
  16. spring框架的IOC的底层原理
  17. Centos7 Mysql5.7主从服务器配置
  18. uvm设计分析——field automation
  19. Linux命令:history
  20. 表迁移工具的选型-复制ibd的方法-传输表空间

热门文章

  1. 初次搭建spring boot 项目(实验楼-学习笔记)
  2. FastDFS 搭建
  3. 动态计算UITableViewCell高度详解 (转)
  4. Mysql慢查询 [第一篇]
  5. System.IO.IOException: The handle is invalid.
  6. 【起航计划 026】2015 起航计划 Android APIDemo的魔鬼步伐 25 App->Notification->Status Bar 状态栏显示自定义的通知布局,省却声音、震动
  7. Odoo (OpenERP/TinyERP)-10.0 (Debian 8)
  8. 去除Windows平台下每行代码的“^m”
  9. Computer Science: the Big Picture
  10. mongodb在C#的连接以及curd写法