Python探路-多重继承

多重继承都会让python初学者很疑惑,哪怕当时看完,过一段时间也就遗忘了,因此写下了本文,希望借此能够让python初学者能够比较深刻的记住。

多重继承查找父类的方法有两种:

1、深度优先---针对经典类,即python2.2之前和python2.7

2、C3算法---针对新式类

一、深度优先:

可从某个定点v出发,访问此顶点,然后一次从v的违背访问的邻接点触发深度优先遍历图,直至途中所有和v有路径相同的顶点都被访问到;若此时途中尚有顶点未被访问,则另选途中一个未曾被访问的顶点做开始点。

例:

结果:v1, v2, v4, v5, v3, v7, v6

2、C3 MRO算法:

     这里的关键在于 merge,其输入是一组列表,按照如下方式输出一个列表:

1)检查第一个列表的头元素(如 L[B] 的头),记作 H。

L[B]=[B]+L[D]+L[E]+[D]+[E]
              =[B] + merge([D,object],[E,object],[D],[E])
              =[B,D] + merge([object],[E,object],[E])
              =[B,D,E,object]

其中,[B,D,E,object]中的B代表头,其他都是尾

2)若 H 未出现在其它列表的尾部,则将其输出,并将其从所有列表中删除,然后回到步骤1;否则,取出下一个列表的头部记作 H,继续该步骤。

上面的merge([D,object],[E,object],[D],[E])中,D未出现其他列表的尾部所以输出D

3)  重复上述步骤,直至列表为空或者不能再找出可以输出的元素。如果是前一种情况,则算法结束;如果是后一种情况,说明无法构建继承关系,Python 会抛出异常。

如果出现merge([D,E,object],[E,D,object],[D],[E]),即D又是[E,D,object]的尾,而E又是[D,E,object]的尾,D和E都不能输出,即出现了D和E相互继承的关系,会拋异常

其实举个例子更能说明问题:

结果大概是这样:

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

mro(B) = [B] + mro(D)

mro(D)=[D,O]

所以:mro(A)= [A] + merge(mro(B),mro(C),[B,C])

                          =  [A] + merge([B,mro(D)],[C,O],[B,C])

由于B不在任何列表的列尾,所以上式等于:

                         = [A,B]+merge([mro(D)],[C,O],[C])

                         = [A,B]+merge([D,O],[C,O],[C])

                         = [A,B,D]+merge([O],[C,O],[C])

由于O为[C,O]的列尾,所以寻找下一个C,所以最终结果为:

                         = [A,B,D,C,O]

注:对于一个列表[A,B,C],A为列头,[B,C]为列尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值