python的多继承C3(mro)算法

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

 

posted @ 2018-05-02 17:36  王剑威  阅读(209)  评论(0编辑  收藏  举报