[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

MRO Error on Multiple Inheritance?

Ming

1/4/2008 8:04:00 PM

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.
4 Answers

Fredrik Lundh

1/4/2008 8:13:00 PM

0

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>

Ben Finney

1/4/2008 11:13:00 PM

0

Ming <minger@gmail.com> 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_p... 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

Michele Simionato

1/5/2008 5:41:00 AM

0

On Jan 4, 9:03 pm, Ming <min...@gmail.com> 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/release...

Ming

1/6/2008 3:00:00 AM

0

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 <bignose+hates-s...@benfinney.id.au>
wrote:
> Ming <min...@gmail.com> 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_p... 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