python中继承的搜索顺序

the searching order of inheritance in python

本问题已经有最佳答案,请猛点这里访问。

在搜索属性时,python将查找对象g 1st。如果我对下图中命名的每个类(2=2nd,3=3rd等)编号,任何人都可以向我显示所有这些类的搜索顺序。

1
2
3
4
5
6
7
8
9
class A : pass
class B : pass
class C(A,object): pass
class D: pass
class E(D,B): pass
class F(B,C): pass
class G(E,F): pass

g = G()

此命令:

1
2
3
4
5
6
>>> G.__mro__
(<class '__main__.G'>, <class __main__.E at 0x028412D0>, <class __main__.D at 0x
02841298>, <class '__main__.F'>, <class __main__.B at 0x02841260>, <class '__mai
n__.C'
>, <class __main__.A at 0x02841228>, <type 'object'>)
>>> print ', '.join(klass.__name__ for klass in G.__mro__)
G, E, D, F, B, C, A, object

如果你想知道这个顺序是如何计算的,就没有一个好的、简短的答案。不完整的简短答案是,python确保子类在超类之前出现,而类在基类列表的前面出现,类在基类列表的后面出现。长答案是关于python.org上c3线性化的40页文档,尽管实际的算法不是40页。