Was ist mro?

Method Resolution Order (MRO)

Die Method Resolution Order (MRO), zu Deutsch Methodenauflösungsreihenfolge, ist ein Konzept in der objektorientierten Programmierung, das insbesondere in Sprachen wie Python eine wichtige Rolle spielt. Sie bestimmt die Reihenfolge, in der Basisklassen bei der Suche nach einer Methode oder einem Attribut durchlaufen werden, wenn eine Methode oder ein Attribut nicht direkt in der Klasse selbst gefunden wird.

Was ist MRO?

Die MRO ist im Wesentlichen ein Algorithmus, der festlegt, wie Python die Vererbungshierarchie einer Klasse durchläuft, um die korrekte Methode oder das korrekte Attribut zu finden. Dies ist besonders wichtig bei Mehrfachvererbung, da es mehrere mögliche Pfade gibt, die Python folgen könnte. Die MRO stellt sicher, dass eine konsistente und vorhersehbare Reihenfolge eingehalten wird.

Warum ist MRO wichtig?

  • Vorhersagbarkeit: Sie ermöglicht es Entwicklern, vorherzusagen, welche Methode aufgerufen wird, wenn mehrere Basisklassen eine Methode mit demselben Namen definieren.
  • Konsistenz: Sie stellt sicher, dass der Code in verschiedenen Umgebungen und über verschiedene Python-Versionen hinweg gleich funktioniert.
  • Vermeidung von Konflikten: Sie hilft, Konflikte zu lösen, die bei Mehrfachvererbung auftreten können, indem sie eine klare Reihenfolge für die Auflösung von Methoden und Attributen festlegt.

Wie funktioniert die MRO in Python?

Python verwendet den C3-Linearisierungsalgorithmus, um die MRO zu berechnen. Dieser Algorithmus stellt sicher, dass die MRO folgende Eigenschaften aufweist:

  • Lokale Vorrangstellung: Eine Klasse hat immer Vorrang vor ihren Basisklassen.
  • Monotonie: Die Reihenfolge der Basisklassen in der Klassendefinition wird beibehalten.
  • Superklassen-Linearisierung: Die Linearisierung einer Klasse kombiniert die Linearisierungen ihrer Eltern auf eine Weise, die diese Eigenschaften respektiert.

Wie kann man die MRO einer Klasse überprüfen?

In Python kann die MRO einer Klasse mithilfe des __mro__-Attributs oder der mro()-Methode abgerufen werden.

class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

print(D.__mro__)
# Ausgabe: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

print(D.mro())
# Ausgabe: [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

In diesem Beispiel zeigt die MRO von Klasse D, dass Python zuerst in D, dann in B, dann in C, dann in A und schließlich in object nach Methoden und Attributen sucht.

Beispiele für die Anwendung der MRO:

  • Auflösung von Methodenkonflikten bei Mehrfachvererbung: Die MRO bestimmt, welche Methode aufgerufen wird, wenn mehrere Basisklassen eine Methode mit demselben Namen definieren.
  • Korrekte Initialisierung von Objekten: Die MRO stellt sicher, dass die __init__-Methoden aller Basisklassen in der richtigen Reihenfolge aufgerufen werden.
  • Verwendung von super(): Die super()-Funktion verwendet die MRO, um die nächste Klasse in der Hierarchie zu finden, in der eine Methode aufgerufen werden soll. Mehr dazu unter Super() Funktion.

Zusammenfassend ist die MRO ein wichtiges Konzept für das Verständnis der objektorientierten Programmierung in Python, insbesondere im Zusammenhang mit Vererbung und Mehrfachvererbung. Sie ermöglicht es Entwicklern, die Reihenfolge der Methodenauflösung vorherzusagen und Konflikte zu vermeiden. Das Verständnis der C3-Linearisierung hilft beim Verständnis des Algorithmus hinter MRO.