zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    IE6 PNG透明的简单方法
    float转int没有所谓的四舍五入
    点链接切换图片
    在受虐中成长--2009.12.18
    javascript构造弹出div 并可关闭--待修改的
    JavaScript里面的几个true or false
    2010新年要有一个新的开始
    与技术无关的书单--你可以笑着说有些是“精神鸦片”
    openlayers参考网页
    javac mac 终端乱码
  • 原文地址:https://www.cnblogs.com/594504110python/p/9373234.html
Copyright © 2011-2022 走看看