Method Resolution Order
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 21 von 64.
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üfen Sie die MRO mit __mro__:
print(C.__mro__)Ausgabe:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)Das Attribut __mro__ ist ein Tupel, 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 schließlich der integrierten Klasse object.
Erstellen Sie ein Objekt und rufen Sie die Methode auf:
c = C()
print(c.method())Ausgabe:
Method from APython hat die Methode zuerst in Klasse A gefunden (an Index 1 in der MRO) und hat diese daher verwendet.
Ändere 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())Ausgabe:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from BJetzt findet Python die Methode von B zuerst, da B in der Vererbungsliste vor A steht. Sie können auf bestimmte Klassen in der MRO mittels Indizierung 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())Dies liefert das gleiche Ergebnis wie __mro__, aber als Liste.
Wichtiger Punkt: Python sucht nach Methoden in der MRO-Reihenfolge – zuerst in der Klasse selbst (Index 0), dann in den Elternklassen von links nach rechts, wie sie in der Klassendefinition aufgeführt sind (Indizes 1, 2, etc.). 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.
Spickzettel
Die Method Resolution Order (MRO) ist die Reihenfolge, die Python verwendet, um nach Methoden zu suchen, wenn mehrere Klassen denselben Methodennamen haben.
Überprüfen Sie die MRO mit __mro__ oder mro():
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
pass
print(C.__mro__)
print(C.mro()) # Gleiches Ergebnis als ListePython sucht nach Methoden in der MRO-Reihenfolge – zuerst in der Klasse selbst, dann in den Elternklassen von links nach rechts, wie in der Klassendefinition angegeben:
c = C()
print(c.method()) # "Method from A" - A kommt vor B
class D(B, A): # B kommt jetzt vor A
pass
d = D()
print(d.method()) # "Method from B" - B kommt vor AProbier es selbst
# TODO: Alle erforderlichen Klassen importieren
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop
def explain_mro(class_name):
# TODO: Die MRO (Method Resolution Order) für die angegebene Klasse ausgeben
# TODO: Format: "MRO for [class name]:" (Hinweis: KEIN Leerzeichen nach dem Doppelpunkt)
# TODO: class_name.__name__ verwenden, um den Namen der Klasse zu erhalten
# TODO: class_name.__mro__ verwenden, um das MRO-Tupel zu erhalten
# TODO: Jeden Klassennamen in der MRO in separaten Zeilen ausgeben
# TODO: Eine Instanz der Klasse erstellen
# TODO: power_on() für die Instanz aufrufen und das Ergebnis speichern
# TODO: Ausgeben: "Power on result: [result]"
# TODO: Eine Leerzeile für bessere Lesbarkeit ausgeben
pass
# Testen Sie Ihren Code
# TODO: explain_mro() mit jeder Klasse aufrufen: 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 Benutzerklassen