Menu
Coddy logo textTech

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 A

Python 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 B

Jetzt 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.

challenge icon

Aufgabe

Mittel

In dieser Herausforderung wirst du eine Klassenhierarchie implementieren.

Du musst diese Dateien bearbeiten:

  • device.py: Implementiere die Basisklasse Device
  • screen.py: Implementiere die Klasse Screen, die von Device erbt
  • computer.py: Implementiere die Klasse Computer, die von Device erbt
  • laptop.py: Implementiere die Klasse Laptop mit Mehrfachvererbung
  • driver.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 Liste

Python 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 A

Probier 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
quiz iconTeste dich selbst

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