您的位置:首页 > 编程语言 > Python开发

理解Python多继承

2017-12-23 12:27 309 查看
在编写python工程的时候遇到了 Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases P2,P1这个异常,原因是我写多重继承的时候因为父类的顺序问题导致这个error。

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):#这个类如果去掉的话也可以没有错误,如果加上这个类后,按照这种写法,会导致mro中无法在唯一确认类之间的关系,会导致继承关系混乱(我的理解,由于类的祖先类的查找顺序是广度优先,而不是尝试优先,所以它无法确认P1,P2在祖先图谱中的顺序)
pass

        

其中红色的地方就是出错的地方。把p1与p2换下位置就好了。

 我认为原理如下:

就像上面GC类后面的注释一样(
这个类如果去掉的话也可以没有错误,如果加上这个类后,按照这种写法,会导致mro中无法在唯一确认类之间的关系,会导致继承关系混乱(我的理解,由于类的祖先类的查找顺序是"从左到右,深度优先",所以它无法确认P1,P2在祖先图谱中的顺序)


),如果加上GC类后它们的图谱关系就如图



python是无法确认P1在图中的具体位置的。所以会报出MRO错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: