Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > MRO Error on Multiple Inheritance?

Reply
Thread Tools

MRO Error on Multiple Inheritance?

 
 
Ming
Guest
Posts: n/a
 
      01-04-2008
I'm working through Wesley Chun's CPP2e and got this error on 13.11.1,
pp 548 where his interpreter snippet shows no problems:

ActivePython 2.5.1.1 (ActiveState Software Inc.) b
Python 2.5.1 (r251:54863, May 1 2007, 17:47:05) [
win32
Type "help", "copyright", "credits" or "license" f
>>> class A(object): pass

....
>>> class B(A): pass

....
>>> class C(B): pass

....
>>> class D(A, B): pass

....
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases A, B

(I submitted the problem to the author but I'm not sure I'll ever hear
back.) I'm guessing that this kind of diamond inheritance is
prohibited by the interpreter, and that his lack of error messages
from the interpretation is due to actually leaving out the "class
B(A): pass" Can someone shed light? Thanks.
 
Reply With Quote
 
 
 
 
Fredrik Lundh
Guest
Posts: n/a
 
      01-04-2008
Ming wrote:


> TypeError: Error when calling the metaclass bases
> Cannot create a consistent method resolution
> order (MRO) for bases A, B
>
> (I submitted the problem to the author but I'm not sure I'll ever hear
> back.) I'm guessing that this kind of diamond inheritance is
> prohibited by the interpreter, and that his lack of error messages
> from the interpretation is due to actually leaving out the "class
> B(A): pass"


or, alternatively, leaving out the (object) in the first class definition:

>>> class A: pass

....
>>> class B(A): pass

....
>>> class D(A, B): pass

....
>>>


</F>

 
Reply With Quote
 
 
 
 
Ben Finney
Guest
Posts: n/a
 
      01-04-2008
Ming <(E-Mail Removed)> writes:

> I'm working through Wesley Chun's CPP2e and got this error on 13.11.1,
> pp 548 where his interpreter snippet shows no problems:


I don't know what a "CPP2e" is. Is it a book? Can you give the ISBN?

> ActivePython 2.5.1.1 (ActiveState Software Inc.) b
> Python 2.5.1 (r251:54863, May 1 2007, 17:47:05) [
> win32
> Type "help", "copyright", "credits" or "license" f
> >>> class A(object): pass

> ...
> >>> class B(A): pass

> ...
> >>> class C(B): pass

> ...
> >>> class D(A, B): pass

> ...
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: Error when calling the metaclass bases
> Cannot create a consistent method resolution
> order (MRO) for bases A, B
>
> (I submitted the problem to the author but I'm not sure I'll ever hear
> back.) I'm guessing that this kind of diamond inheritance is
> prohibited by the interpreter, and that his lack of error messages
> from the interpretation is due to actually leaving out the "class
> B(A): pass" Can someone shed light? Thanks.


That's not an example of diamond inheritance
<URL:http://en.wikipedia.org/wiki/Diamond_problem> because classes A
and B are not distinct classes with a *common* base. Instead, they're
in a direct parent-child relationship.

So there's no sense in defining class D to inherit from both A *and*
B. To get a descendent of both those classes, inheriting from B is
sufficient. It should rather be::

class D(B): pass

--
\ "Pinky, are you pondering what I'm pondering?" "Uh, I think so, |
`\ Brain, but we'll never get a monkey to use dental floss." -- |
_o__) _Pinky and The Brain_ |
Ben Finney
 
Reply With Quote
 
Michele Simionato
Guest
Posts: n/a
 
      01-05-2008
On Jan 4, 9:03 pm, Ming <(E-Mail Removed)> wrote:
> I'm working through Wesley Chun's CPP2e and got this error on 13.11.1,
> pp 548 where his interpreter snippet shows no problems:
>
> ActivePython 2.5.1.1 (ActiveState Software Inc.) b
> Python 2.5.1 (r251:54863, May 1 2007, 17:47:05) [
> win32
> Type "help", "copyright", "credits" or "license" f>>> class A(object): pass
> ...
> >>> class B(A): pass

> ...
> >>> class C(B): pass

> ...
> >>> class D(A, B): pass

>
> ...
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: Error when calling the metaclass bases
> Cannot create a consistent method resolution
> order (MRO) for bases A, B
>
> (I submitted the problem to the author but I'm not sure I'll ever hear
> back.) I'm guessing that this kind of diamond inheritance is
> prohibited by the interpreter, and that his lack of error messages
> from the interpretation is due to actually leaving out the "class
> B(A): pass" Can someone shed light? Thanks.


Yes, the MRO for new-style classes changed in Python 2.3, see
http://www.python.org/download/releases/2.3/mro/
 
Reply With Quote
 
Ming
Guest
Posts: n/a
 
      01-06-2008
Thanks for the all the replies. CPP2e is the Second Edition of the
book "Core Python Programming."

On Jan 4, 6:13 pm, Ben Finney <(E-Mail Removed)>
wrote:
> Ming <(E-Mail Removed)> writes:
> > I'm working through Wesley Chun's CPP2e and got this error on 13.11.1,
> > pp 548 where his interpreter snippet shows no problems:

>
> I don't know what a "CPP2e" is. Is it a book? Can you give the ISBN?
>
>
>
> > ActivePython 2.5.1.1 (ActiveState Software Inc.) b
> > Python 2.5.1 (r251:54863, May 1 2007, 17:47:05) [
> > win32
> > Type "help", "copyright", "credits" or "license" f
> > >>> class A(object): pass

> > ...
> > >>> class B(A): pass

> > ...
> > >>> class C(B): pass

> > ...
> > >>> class D(A, B): pass

> > ...
> > Traceback (most recent call last):
> > File "<stdin>", line 1, in <module>
> > TypeError: Error when calling the metaclass bases
> > Cannot create a consistent method resolution
> > order (MRO) for bases A, B

>
> > (I submitted the problem to the author but I'm not sure I'll ever hear
> > back.) I'm guessing that this kind of diamond inheritance is
> > prohibited by the interpreter, and that his lack of error messages
> > from the interpretation is due to actually leaving out the "class
> > B(A): pass" Can someone shed light? Thanks.

>
> That's not an example of diamond inheritance
> <URL:http://en.wikipedia.org/wiki/Diamond_problem> because classes A
> and B are not distinct classes with a *common* base. Instead, they're
> in a direct parent-child relationship.
>
> So there's no sense in defining class D to inherit from both A *and*
> B. To get a descendent of both those classes, inheriting from B is
> sufficient. It should rather be::
>
> class D(B): pass
>
> --
> \ "Pinky, are you pondering what I'm pondering?" "Uh, I think so, |
> `\ Brain, but we'll never get a monkey to use dental floss." -- |
> _o__) _Pinky and The Brain_ |
> Ben Finney


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
MRO theory Clarence Python 4 04-12-2007 05:32 PM
TypeError: Cannot create a consistent method resolution order (MRO) for bases object digitalorganics@gmail.com Python 8 06-27-2006 06:57 AM
How to devise run-time pluggable classes? (MRO problem) =?iso-8859-1?Q?Fran=E7ois?= Pinard Python 0 08-20-2005 06:35 PM
don't understand MRO Uwe Mayer Python 3 06-24-2005 09:53 AM
MRO problems with diamond inheritance? John Perks and Sarah Mount Python 13 05-03-2005 05:21 AM



Advertisments