Commit cde686ee authored by Raymond Hettinger's avatar Raymond Hettinger

SF #1382213: Tutorial section 9.5.1 ignores MRO for new-style classes

parent d3187a05
...@@ -4329,8 +4329,7 @@ class DerivedClassName(Base1, Base2, Base3): ...@@ -4329,8 +4329,7 @@ class DerivedClassName(Base1, Base2, Base3):
<statement-N> <statement-N>
\end{verbatim} \end{verbatim}
The only rule necessary to explain the semantics is the resolution For old-style classes, the only rule is depth-first,
rule used for class attribute references. This is depth-first,
left-to-right. Thus, if an attribute is not found in left-to-right. Thus, if an attribute is not found in
\class{DerivedClassName}, it is searched in \class{Base1}, then \class{DerivedClassName}, it is searched in \class{Base1}, then
(recursively) in the base classes of \class{Base1}, and only if it is (recursively) in the base classes of \class{Base1}, and only if it is
...@@ -4345,16 +4344,26 @@ a name conflict with an attribute of \class{Base2}. The depth-first ...@@ -4345,16 +4344,26 @@ a name conflict with an attribute of \class{Base2}. The depth-first
rule makes no differences between direct and inherited attributes of rule makes no differences between direct and inherited attributes of
\class{Base1}.) \class{Base1}.)
It is clear that indiscriminate use of multiple inheritance is a For new-style classes, the method resolution order changes dynamically
maintenance nightmare, given the reliance in Python on conventions to to support cooperative calls to \function{super()}. This approach
avoid accidental name conflicts. A well-known problem with multiple is known in some other multiple-inheritance languages as call-next-method
inheritance is a class derived from two classes that happen to have a and is more powerful than the super call found in single-inheritance languages.
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 With new-style classes, dynamic ordering is necessary because all
variables'' or data attributes used by the common base class), it is cases of multiple inheritance exhibit one or more diamond relationships
not clear that these semantics are in any way useful. (where one at least one of the parent classes can be accessed through
multiple paths from the bottommost class). For example, all new-style
classes inherit from \class{object}, so any case of multiple inheritance
provides more than one path to reach \class{object}. To keep the
base classes from being accessed more than once, the dynamic algorithm
linearizes the search order in a way that preserves the left-to-right
ordering specified in each class, that calls each parent only once, and
that is monotonic (meaning that a class can be subclassed without affecting
the precedence order of its parents). Taken together, these properties
make it possible to design reliable and extensible classes with
multiple inheritance. For more detail, see
\url{http://www.python.org/download/releases/2.3/mro/}.
%% XXX Add rules for new-style MRO?
\section{Private Variables \label{private}} \section{Private Variables \label{private}}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment