栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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算法的递归思想值得注意

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号