Heim >Backend-Entwicklung >Python-Tutorial >Wie verarbeitet die Funktion „super()' von Python die Methodenauflösungsreihenfolge (MRO) bei der Mehrfachvererbung?
Einführung
Mehrfachvererbung stellt eine einzigartige Herausforderung dar, wenn es darum geht, das übergeordnete Element zu bestimmen Methode, die mit der Funktion super() aufgerufen werden soll. Dieser Artikel untersucht das Verhalten von super() in solchen Szenarien und konzentriert sich dabei auf seine Interaktion mit Method Resolution Order (MRO).
Super() und Parent Method Invocation
Wenn super() mit Mehrfachvererbung verwendet wird, verweist es auf die Methode der übergeordneten Klasse, die im MRO an erster Stelle steht. Im folgenden Codeausschnitt heißt es beispielsweise:
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
Der MRO für Third ist [Third, First, Second, object]. Daher bezieht sich super().__init__() in Third auf First.__init__.
Method Resolution Order (MRO)
Die MRO bestimmt die Reihenfolge, in der Python sucht für Methoden und Attribute, die von übergeordneten Klassen geerbt wurden. Im Allgemeinen listet das MRO zuerst die untergeordnete Klasse auf, gefolgt von ihren Eltern, wie sie in der Klassendefinition aufgeführt sind.
Im obigen Beispiel ist das MRO [Drittes, Erstes, Zweites, Objekt]. Diese Reihenfolge wird verwendet, um Methodenaufrufe und Attributsuchen aufzulösen, beginnend bei der dritten Klasse und nach unten im Baum der übergeordneten Klassen.
Anpassung und Mehrdeutigkeit
Während Python normalerweise die erstellt MRO automatisch, es ist möglich, es mithilfe des Attributs mro anzupassen. Es ist jedoch wichtig sicherzustellen, dass das MRO eindeutig ist. Ist dies nicht der Fall, löst Python eine Ausnahme aus.
Betrachten Sie das folgende mehrdeutige MRO:
class First(object): def __init__(self): print("first") class Second(First): def __init__(self): print("second") class Third(First, Second): def __init__(self): print("third")
Sollte das MRO von Third [First, Second] oder [Second, First] lauten? Es gibt keine klare Erwartung, daher gibt Python einen Fehler aus:
TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases Second, First
MRO verstehen
Um vollständig zu verstehen, wie super() mit Mehrfachvererbung interagiert, ist es von entscheidender Bedeutung das Konzept von MRO zu verstehen. Durch das Verständnis der Regeln für die Erstellung und Auflösung von MROs können Entwickler super() effektiv nutzen und potenzielle Konflikte in Mehrfachvererbungsszenarien vermeiden.
Das obige ist der detaillierte Inhalt vonWie verarbeitet die Funktion „super()' von Python die Methodenauflösungsreihenfolge (MRO) bei der Mehrfachvererbung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!