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页。