Methodenauflösungsreihenfolge
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 21 von 64.
Die Method Resolution Order (MRO) ist die Reihenfolge, in der Python nach Methoden sucht, 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 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 übergeordneten Klassen von links nach rechts (A, dann B) und schließlich der integrierten Klasse object.
Erstelle ein Objekt und rufe die Methode auf:
c = C()
print(c.method())Output:
Method from APython hat die Methode zuerst in der Klasse A gefunden (am Index 1 in der MRO) und daher 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 zuerst die Methode von B, weil B in der Vererbungsliste vor A steht. Du kannst mithilfe der Indizierung auf bestimmte Klassen in der MRO 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 Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDie super()-FunktionMethodenüberschreibungMehrfachvererbungMethodenauflösungsreihenfolgeWiederholung – Mitarbeiterhierarchie7Spezielle Methoden
Einführung in magische MethodenOperatorüberladungMagische Methoden für ContainerRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungsservice2Dekoratoren
Einführung in DekoratorenProperty-DekoratorDekorator für statische MethodenDekorator für Klassenmethoden5Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypingAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische Methoden und KlassenmethodenKlassen-DekoratorenKontextmanager3Klassenattribute
Instanz- vs. KlassenvariablenProperty-DecoratorsPrivate AttributeWiederholung – Bankkontoverwaltung6Kapselung
Öffentliche, geschützte, private MemberZugriffsmodifikatorenInformationsverbergungProperty-Decorators – FortgeschrittenWiederholung – System zur Verwaltung von Studentendaten12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionAdministrationsoberflächeTests und IntegrationÜbe selbstständig: Online-Python-Compiler