理解Python多继承

当遇到: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错误。

猜你喜欢

转载自blog.csdn.net/nicajonh/article/details/78879276
今日推荐