Python面向对象继承中的C3算法

Python面向对象继承中的C3算法,第1张

Python面向对象继承中的C3算法

在Python的类中调用成员时,首先会优先在自己的类中找,没有的话则去父类中找

如果一个类继承了多个父类,或者说他们遵循复杂的继承关系

C3算法将解决这些复杂关系的顺序问题

以下将展示一个复杂的继承关系


1.1 mro

可以使用mro( )来获取当前类的继承关系

以下是mro( )的使用举例

class B(object):
	pass 

class C(object):
	pass

class A(B,c):
	pass


print(A.mro())
>>>[, , , ]

1.2 mro的计算方法

 mro(A) = [A] + merge(mro(B), mro(c), [B,C])
mro(A) = [A] + merge([B,object], [C,object], [B,C])
mro(A) = [A] + [B,C,object]
mro(A) = [A,B,C,object]

mro计算方法的步骤

s1:  写出各个父类的继承关系(以递归的方式写出)
s2:  得到merge([],[],[],...,[])
s3:  取第一个括号的第一个元素与除第一个括号的其他括号中的除去第一个元素以外的元素比较
s4:  如果存在相同元素,则将所取的第一个元素拿下来,放到之后的有序序列中
s5:  如果不存在相同元素,则跳过第一个括号,取第二个括号的第一个元素进行s4的步骤
s6:  最后将得到有序序列

以上步骤也是c3算法的原理


1.3 复杂情况

若我们不幸遇到这样的继承关系,递归的思想便尤为重要

mro(A) = [A] + merge(mro(B), mro(C), mro(P), [B, C, P])
-----------------------------------------------------------
mro(B) = [B] + merge( mro(D), mro(E), [D,E])

mro(C) = [C] + merge(mro(E),mro(F),[E,F])

-----------------------------------------------------------
依次计算未知序列

mro(A) = [A,B,D,G,H,K,C,E,F,M,N,P]


小结

c3算法的递归思想值得注意

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5711945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存