当遇到:Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases P2,P1这个异常,原因是多重继承的时候因为父类的顺序问题导致。
class P1(object):
def foo(self):
print 'called P1-foo()'
class P2(object):
def foo(self):
print 'called P2-foo()'
def bar(self):
print 'called P2-bar()'
class C1(P2,P1):
pass
class C2(P1,P2):
def bar(self):
print 'called C2-bar()'
class GC(C1,C2):
pass
#由于新式类的类查找顺序是广度优先,所以这样会导致mro中无法在唯一确认类之间的关系,
会导致继承关系混乱
注:新式类查找顺序是广度优先,旧式类查找顺序是深度优先(新式类都从object继承,经典类不需要)
其中红色的地方就是出错的地方。把p1与p2换下位置就好了。
我认为原理如下:
就像上面GC类后面的注释一样,如果加上GC类后它们的图谱关系就如图
python是无法确认P1在图中的具体位置的。所以会报出MRO错误。