Python多重继承MRO
文章目錄
最近在看《Python学习手册》,看到多继承部分,对于函数查找以为使用广度优先,查找MRO文档才发现使用C3算法
对于class C(p1, p2, …, pn), mro(c) = [c] + merge(mro(p1), mro(p2), …, mro(pn), [p1, p2, …, pn])
而其中merge的规则是,从左到右选取第一个在列表中是头,在其它列表中也是头的类,将这个类加入到mro中,并将它从merge中移除,然后继续merge直到结束。如果不能找到这样的头,则无法构造类,将会报错。
举个例子,对于
1 | O = object |
查找顺序是
1 | [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>, <type 'object'>] |
计算过程如下
1 | mro(F) = [F, O] |