Folgen entlang ...:
>>> class A(object): pass
...
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> class B(A): pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
>>> class C(A): pass
...
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
>>>
Solange wir einzelne Erbe haben, ist __mro__
nur das Tupel aus: die Klasse, seine Basis, Basis seiner Basis ist, und so weiter bis zu object
(nur funktioniert natürlich auch für neue Klassen.
Jetzt, mit mehrere Erbe ...:
>>> class D(B, C): pass
...
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
... Sie erhalten auch die Gewissheit, dass in __mro__
wird keine Klasse dupliziert, und keine Klasse kommt nach seinen Vorfahren, außer daß Klassen, die zuerst auf der gleichen Ebene der Mehrfachvererbung eintreten (wie B und C in diesem Beispiel), sind in der __mro__
von links nach rechts.
Jedes Attribut, das Sie für eine Klasseninstanz erhalten, nicht nur Methoden, wird konzeptuell entlang der __mro__
gesucht. Wenn also mehr als eine Klasse unter den Vorfahren diesen Namen definiert, sagt dies Ihnen, wo das Attribut gefunden wird - in der ersten Klasse in __mro__
, die diesen Namen definiert.
http://www.python.org/download/releases/2.3/mro – GodMan
Ooph, was für eine lange Lese das ist. – paulmelnikow