Method Resolution Order
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 21 von 64.
Die Method Resolution Order (MRO) ist die Reihenfolge, die Python verwendet, um nach Methoden zu suchen, wenn mehrere Klassen denselben Methodennamen haben.
Hier ist ein Beispiel mit mehreren Klassen, die dieselbe Methode haben:
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
passÜberprüfe die MRO mit __mro__:
print(C.__mro__)Ausgabe:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)Das __mro__-Attribut ist ein Tuple, das alle Klassen in der Auflösungsreihenfolge enthält. Das erste Element (__mro__[0]) ist immer die Klasse selbst (C), gefolgt von den Elternklassen von links nach rechts (A, dann B) und schlussendlich der eingebauten object-Klasse.
Create ein object und call die method:
c = C()
print(c.method())Output:
Method from APython hat die Method zuerst in der Class A gefunden (an Index 1 in der MRO), daher wurde diese verwendet.
Ändern Sie die Vererbungsreihenfolge, um den Unterschied zu sehen:
class D(B, A): # B kommt jetzt vor A
pass
print(D.__mro__)
d = D()
print(d.method())Output:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from BJetzt findet Python B's method first, da B before A in der inheritance-Liste comes. Sie können auf bestimmte classes in der MRO über Indexierung zugreifen – D.__mro__[0] ist D selbst, D.__mro__[1] ist B und D.__mro__[2] ist A.
Sie können auch die mro()-Methode verwenden:
print(C.mro())Während mro() und __mro__ dieselbe Sequenz von classes liefern, unterscheiden sie sich im Typ: __mro__ gibt ein Tupel zurück, während mro() eine Liste zurückgibt.
Wichtiger Punkt: Python sucht nach Methoden in MRO-Reihenfolge – zuerst die Klasse selbst (Index 0), dann die Elternklassen von links nach rechts, wie in der Klassendefinition angegeben (Indizes 1, 2 usw.). Die erste gefundene Methode wird verwendet.
Aufgabe
MittelIn dieser Herausforderung wirst du eine Klassenhierarchie implementieren.
Du musst diese Dateien bearbeiten:
device.py: Implementiere die BasisklasseDevicescreen.py: Implementiere die KlasseScreen, die vonDeviceerbtcomputer.py: Implementiere die KlasseComputer, die vonDeviceerbtlaptop.py: Implementiere die KlasseLaptopmit Mehrfachvererbungdriver.py- Implementiere Testfälle, die überprüfen, ob deine Implementierung korrekt funktioniert
Jede Datei enthält detaillierte TODO-Kommentare, die dich Schritt für Schritt durch die Implementierung führen.
Probier es selbst
# TODO: Importiere alle erforderlichen Klassen
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop
def explain_mro(class_name):
# TODO: Gib die MRO (Method Resolution Order) für die gegebene Klasse aus
# TODO: Format: "MRO for [class name]:" (Hinweis: KEIN Leerzeichen nach dem Doppelpunkt)
# TODO: Verwende class_name.__name__, um den Namen der Klasse zu erhalten
# TODO: Verwende class_name.__mro__, um das MRO-Tupel zu erhalten
# TODO: Gib jeden Klassennamen in der MRO in separaten Zeilen aus
# TODO: Erstelle eine Instanz der Klasse
# TODO: Rufe power_on() auf der Instanz auf und speichere das Ergebnis
# TODO: Print: "Power on result: [result]"
# TODO: Gib eine leere Zeile für bessere Lesbarkeit aus
pass
# Teste deinen Code
# TODO: Rufe explain_mro() mit jeder Klasse auf: Device, Screen, Computer und Laptop
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionalitätAdmin-InterfaceTesten und Integration