码迷,mamicode.com
首页 > 其他好文 > 详细

TypeError: Cannot create a consistent method resolution order (MRO) for bases P1, P2

时间:2017-10-26 10:25:22      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:typeerror: cannot create a consistent method resolution order (mro) for bases p1   p2   

新式类多重继承原则:广度优先,从左到右
==================正确==================
In [19]: 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(P1,P2):   ###P1和P2顺序一致
    ...:     pass
    ...: class C2(P1,P2):   ###P1和P2顺序一致
    ...:     def bar(self):
    ...:         print(‘called C2-bar()‘)
    ...: class GC(C2,C1):
    ...:     pass
In [20]: gc.foo()
called P1-foo() ### GC--->C2--->C1--->P2
In [21]: gc.bar()
called C2-bar()  ### GC--->C2--->C1
==================正确==================
In [31]: 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):  ###P2和P1顺序一致
    ...:     pass
    ...: class C2(P2,P1):  ###P2和P1顺序一致
    ...:     def bar(self):
    ...:         print(‘called C2-bar()‘)
    ...: class GC(C2,C1):
    ...:     pass
In [33]: gc.foo()
called P2-foo() ### GC--->C2--->C1--->P2
In [34]: gc.bar()
called C2-bar()   ### GC--->C2--->C1
==================正确==================
In [29]: 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()‘)
    ...: 
==================错误==================
In [26]: 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):   ###P2和P1
    ...:     pass
    ...: class C2(P1,P2):   ###P1和P2
    ...:     def bar(self):
    ...:         print(‘called C2-bar()‘)
    ...: class GC(C2,C1):
    ...:     pass
    ...: 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-7eeba137b395> in <module>()
     12     def bar(self):
     13         print(‘called C2-bar()‘)
---> 14 class GC(C2,C1):
     15     pass
TypeError: Cannot create a consistent method resolution
order (MRO) for bases P2, P1

原因分析:
子类GC在继承C2和C1时,无法分辨C1和C2中P1和P2的继承关系,一会(P1,P2)一会又是(P2,P1),导致GC继承MRO出错。
因为继承顺序发生了改变,所以gc.foo()和gc.bar()调用的结果也发生了改变。

自己试出来的不知道对不对技术分享

本文出自 “LINUX” 博客,请务必保留此出处http://wangpengtai.blog.51cto.com/3882831/1976199

TypeError: Cannot create a consistent method resolution order (MRO) for bases P1, P2

标签:typeerror: cannot create a consistent method resolution order (mro) for bases p1   p2   

原文地址:http://wangpengtai.blog.51cto.com/3882831/1976199

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!