MRO Error on Multiple Inheritance?
Ben Finney
bignose+hates-spam at benfinney.id.au
Fri Jan 4 18:13:07 EST 2008
Ming <minger at 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_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
More information about the Python-list
mailing list