Menu
Coddy logo textTech

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 A

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

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

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.

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