Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for

今天在学习python的时候遇到了 Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases P2,P1这个异常,然后观察了一下代码发现了问题,原因是我写多重继承的时候因为父类的顺序问题导致了python的方法解析顺序出现了问题。

原代码如下:

复制代码
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错误。

原文链接:http://www.cnblogs.com/yudy/archive/2013/06/10/3130521.html

 

注:以上现象是在经典类中出现的,在新式类中没有此问题。但是可能你不能调用到你想调用的方法。

补充:

这个问题在python 2.7的经典类中依然存在!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值