python mro c3_python的MRO和C3算法

classA:pass

classB(A):pass

classC(A):pass

classD(B, C):pass

classE(C, A):pass

classF(D, E):pass

classM:pass

classN(M):pass

classP(E, A):pass

classX:pass

classQ(P,N,X):pass

classG(Q, F):pass

classH(G, F):pass加法:merge(),拿第一项的第一位和后面项除了第一位的每位比较,如果没有出现,则该位元素算出

如果出现了,此时开始下一项的第一位继续和后面项除了第一位的每一位比较,

如果后边项里除了第一位的其他位出现有,则继续开始拿下一项的第一位和后一项除了第一位的其他位做比较

如果后边项没有出现,取完这一项的第一位后,重新返回第一项继续执行判断第一项的第一位与后边项除了第一位比较

比如

F+ DBCA + ECA +DE

DBCA+ ECA +DE

BCA+ ECA +E

CA+CA

A+A

思路:

第一次拿第一项的第一位F与DBCA,ECA,DE比较,这三个数除了第一位后面的每一项都没有F出现,

所以把所有的F消除,取值F

第二次拿第二项DBCA的第一位D与ECA,DE比较,这两数中除了第一位后边的每一项都没有D出现,

所以就把所有的D消除,然后取值D

第三次拿第二项BCA的B与ECA,E比较,这两个数中除了第一位后边的每一项都没有B出现,

所以就把所有的B消除,取值B

第四次拿第二项CA的C与ECA,E比较,ECA出现了C,所以不动CA,然后拿下一项的ECA的第一位E与最后一项的值E做比较,

因为ECA的E重复了最后一项E,所以也不动ECA,然后拿最后一项的E与后边作比较,因为后边没项值,

所以消除所有的E,取值E

第四次拿返回开头拿第二项CA中的C与后边的项CA做比较,因为后边项中除了第一位,其他位没有C,

所以消除所有的C,取值C

第五次拿第二项的A与后边的项A做比较,因为后边项值有A,所有拿后边项A与后边项做比较,因为后边项没有值,

所以消除所有的A,取值A

结果

FDBECA

求H的MRO

设求MRO的算法是L

解析步骤:

拆分 合并

L(H)= H + L(G) + L(F) + GF #H + GQPFDBECANMX + FDBECA + GF = HGQPFDBECANMX

L(G) = G + L(Q) + L(F) + QF #G + QPECANMX + FDBECA + QF = GQPFDBECANMX

L(Q) = Q + L(P) + L(N) + L(X) + PNX #Q + PECA + NM + X + PNX = QPECANMX

L(X) = X #X

L(P) = P + L(E) + L(A) + EA #P + ECA + A + EA = PECA

L(N) = N + L(M) + M #N + M + M = NM

L(M) = M #M

L(F) = F + L(D) + L(E) + DE #F + DBCA + ECA + DE = FDBECA

L(E) = E + L(C) + L(A) + CA #E + CA + A + CA = ECA

L(D) = D + L(B) + L(C) + BC #D + BA + CA + BC = DBCA

L(C) = C + L(A) + A #C + A + A = CA

L(B) = B + L(A) + A #B + A + A = BA

L(A) = A #A

所以结果是

HGQPFDBECANMX

和电脑运算的结果一致print(H.__mro__)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值