在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算法的递归思想值得注意
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)