11.5.1 Multiple Inheritance
Python supports a limited form of multiple inheritance as well. A
class definition with multiple base classes looks as follows:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
The only rule necessary to explain the semantics is the resolution
rule used for class attribute references. This is depth-first,
left-to-right. Thus, if an attribute is not found in
DerivedClassName , it is searched for in Base1 , then
(recursively) in the base classes of Base1 , and only if it is
not found there, it is searched for in Base2 , and so on.
(To some people breadth first -- searching Base2 and
Base3 before the base classes of Base1 -- looks more
natural. However, this would require you to know whether a particular
attribute of Base1 is actually defined in Base1 or in
one of its base classes before you can figure out the consequences of
a name conflict with an attribute of Base2 . The depth-first
rule makes no differences between direct and inherited attributes of
Base1 .)
It is clear that indiscriminate use of multiple inheritance is a
maintenance nightmare, given the reliance in Python on conventions to
avoid accidental name conflicts. A well-known problem with multiple
inheritance is a class derived from two classes that happen to have a
common base class. While it is easy enough to figure out what happens
in this case (the instance will have a single copy of "instance
variables" or data attributes used by the common base class), it is
not clear that these semantics are in any way useful.
|