理解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类后面的注释一样(
),如果加上GC类后它们的图谱关系就如图
python是无法确认P1在图中的具体位置的。所以会报出MRO错误。
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错误。
相关文章推荐
- python 类,方法和继承理解
- 【python学习笔记】Python面向对象的理解(封装,继承,多态)
- python的多重继承的理解
- 对于Python面向对象部分的理解(封装继承多态等等)
- java代码---继承-子类使用继承父类的属性。理解测试
- 深入理解python之self
- python 线程理解
- python类的理解(一)
- python多重继承
- Python 中的 if __name__ == "__main__" 该如何理解
- Python函数修饰符的初步理解
- python多继承(新式类)一
- python中使用多继承问题和super()内置函数的使用
- python中HTMLParser简单理解
- python之7-2类的继承与多态
- 判断一个类或实例是否继承自某类的python代码
- Python学习-类和继承
- 对多态和继承的正确理解
- js继承的理解
- 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表