韩漫免费漫画在线观看方法,《好好疼爱里面》免费看,年轻漂亮的女士护士内衣,妈妈醉酒后把我当爸爸电视剧

文章 > Python高级 > Python多继承C3算法解析

Python多继承C3算法解析

头像

爱喝马黛茶的安东尼

2019-07-03 14:33:313094浏览 · 0收藏 · 0评论

Python多继承MRO

在Python2.1中,采用了经典类,使用深度优先算法解析。

Python2.2中,引入了新式类,使用深度优先算法和广度优先算法。

在Python2.3以后的版本中,经典类和新式类共存,使用了DFS算法和C3算法。

Python2中的经典类

class A(object):
    pass

Python3的新式类

class A:
    pass

C3算法

In computing, the C3 superclass linearization is an algorithm used primarily to obtain the order in which methods should be inherited (the "linearization") in the presence of multiple inheritance, and is often termed Method Resolution Order (MRO).

这是维基百科中的定义,下面这张图是一张多继承的关系图:

1562135246563644.png

那么这里的mro解析顺序是如何的呢?单纯看图很难得出答案。

C3线性算法的推导过程如下:

假设类C继承自父类B1,...Bn,类C的解析列表公式如下:

xx.png

这个公式表明C的解析列表是通过对其所有父类的解析列表及其父类一起merge得到的。

相关推荐:《Python视频教程

merge操作分为如下几个步骤:

1.选取merge中的第一个列表记为当前列表K。

2.令h = head(K), 如果h没有出现在其他任何列表的tail(列表中除了第一个元素,其余的称之为tail)当中,那么将其加入类C的线性化列表中,并将其从merge中的所有列表移除,之后重复步骤2。

3.否则,设置K为merge的下一个列表,重复2中的操作。

4.如果merge的所有类都被移除,则输出类创建成功;如果不能找到下一个h,则输出C类抛出异常。

推导过程

我们用上面的那张图试一下推导出mro的解析顺序。

上面那张图转换为python代码如下:

转换成Python代码

O = object
class A(O): pass
class B(O): pass
class C(O): pass
class D(O): pass
class E(O): pass
class K1(A, B, C): pass
class K2(D, B, E): pass
class K3(D, A): pass
class Z(K1, K2, K3): pass
print(Z.mro())

推导

L(K1) = K1 + merge(L[A],L[B],L[C],(A,B,C))
      = K1 + merge(L[A,O],L[B,O],L[C,O],(A,B,C))
      = [K1,A] + merge(L[O],L[B,O],L[C,O],(B,C))
      = [K1,A,B] + merge(L[O],L[O],L[C,O],(C))
      = [K1,A,B,C] + merge(L[O],L[O],L[O])
      = [K1,A,B,C,O]
L(K2) = [K2,D,B,E,O]
L(K3) = [K3,D,A,O]
以上是K1,K2,K3的解析顺序
下面是Z的推导过程
L(Z) = Z + merge(L(K1)+L(K2)+L[K3],(K1,K2,K3))
     = Z + merge(L[K1,A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K1,K2,K3))
     = [Z,K1] + merge(L[A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K2,K3))
     = [Z,K1,K2] + merge(L[A,B,C,O]+L(D,B,E,O)+L(K3,D,A,O),(K3))
     = [Z,K1,K2,K3] + merge(L[A,B,C,O]+L(D,B,E,O)+L(D,A,O))
     = [Z,K1,K2,K3,D] + merge(L[A,B,C,O]+L(B,E,O)+L(A,O))
     = [Z,K1,K2,K3,D,A] + merge(L[B,C,O]+L(B,E,O)+L(O))
     = [Z,K1,K2,K3,D,A,B] + merge(L[C,O]+L(E,O)+L(O))
     = [Z,K1,K2,K3,D,A,B,C] + merge(L[O]+L(E,O)+L(O))
     = [Z,K1,K2,K3,D,A,B,C,E,O]

我们得出的最终答案为:Z的解析顺序:Z->K1->K2->K3->D->A->B->C->E->O

为了验证答案,我们在python中运行

print(Z.mro())

结果如下

[<class '__main__.Z'>, <class '__main__.K1'>, <class '__main__.K2'>, <class '__main__.K3'>, <class '__main__.D'>,
<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>]

和我们推导的结果相同,这就是C3算法的流程。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

摧花狂魔全文阅读免费| 法国《口咬》电影完整版| 《麦子的秘密2》在线观看| YY影院免费观看电视剧网站| 樱花视频在线观看免费高清电视剧 | C2000论坛| 《甜蜜惩罚2》第二季的剧情| 《艳妻互换》完整版| 拔小萝卜免费观看全集电视剧| 蜜桃| 大龟慢慢挺进女友闺蜜的小说| 校花被教官扒开腿狂躁| AGV亚洲版和欧洲版买哪个| 莲井志帆,| 日韩妆和欧的一区二区区别在哪| 继母后妈的梗| 老婆同意了别人轮流联系我| 《无法满足》意大利| 《帐篷里的秘密》动漫| CSGO2开箱网站| 黄文| 两个男人搞一个女人的心理| 明明说好的只蹭蹭苦苦恳求歌词| 女性抹胸开襟哺乳衣的注意事项 | 理伦片丰满妓女院| 少女与狗2在线观看免费版高清| 在线观看日本韩国电影电视剧| -区二区三区| 刀郎个人简历| 窝窝视频网| 三个男人躁我一个爽的后果及影响| 暴躁少女免费看完整版| 欧美大片PPT免费大全| 《黏糊糊的你》动浸免费观看 | 上门女婿一母三女全文免费阅读| 狗和人胶配方20分钟一| 男女做受AHAAAA| 儿子找不到媳妇妈妈能以身相许吗 | 国外不堪入目的演唱会| 《女仆教育》动漫第一季| 美女打屁股