Python类MRO的C3算法具体是怎么算的

前言:这里就不表述MRO的DFS和BFS了,仅介绍C3算法

说明:C3中的head和tail说明,如列表[a,b,c,d],它的head是a,tail是剩下的部分即b,c,d

以菱形继承为例:求L[A]

class D:
    pass


class B(D):
    pass


class C(D):
    pass


class A(B, C)
    pass


L[A] = L[A(B, C)] = [A] + merge(L[B], L[C], [B], [C])

L[B] = L[B(D)] = [B, D]

L[C] = L[C(D)] = [C, D]

        以L(B), L(C)代入L(A)即可得到L[A] = [A] + merge([B, D], [C, D], [B], [C]),以下便对merge方法进行详细说明,以求解L[A]为例。

        1.对于L[A]中merge里的第一个列表[B, D],判断其第一个元素B是否在剩下这几个列表[C, D], [B], [C]的tail中。明显不在,因为列表[C, D]的head是[C]、tail是[D], 列表[B], [C]的head分别是[B], [C],tail均为空。

        2.因为B不在列表[C, D], [B], [C]的tail中,所以将它输出,同时将L[A] = [A] + merge([B, D], [C, D], [B], [C])中merge里的B元素全部删除,即得到L[A] = [A, B] + merge([D], [C, D], [C])。

        3.同步骤2中B元素的判断方法一样,对merge中的第一个元素D进行判断,这里对[D]的操作不同于B,因为在L[A] = [A, B] + merge([D], [C, D], [C])中,[D]元素在merge剩下的两个列表[C, D], [C]中[C, D]的的tail里面,所以要对[D], [C, D]进行换序,即L[A] = [A, B] + merge([C, D], [D], [C])。

        4.同步骤2中B元素一样,对C元素进行同样的操作后,即得到L[A] = [A, B, C] + merge([D], [D]),而merge([D], [D]) = [D],所以L[A] = [A, B, C, D]

        以C3算法最终求得L[A] = [A, B, C, D],即子类A的MRO为A->B->C->D

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值