Heim >Backend-Entwicklung >Python-Tutorial >Wie löst „super()' Methodenaufrufe in der Python-Mehrfachvererbung auf?

Wie löst „super()' Methodenaufrufe in der Python-Mehrfachvererbung auf?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-27 10:33:14191Durchsuche

How Does `super()` Resolve Method Calls in Python Multiple Inheritance?

Super() in Python-Mehrfachvererbung

Mehrfachvererbung in Python wirft die Frage auf, wie super() damit interagiert. Betrachten Sie den folgenden Code:

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

Auf welche übergeordnete Methode von Third bezieht sich super().__init__? Können Sie auswählen, welches ausgeführt wird?

Um super() in diesem Zusammenhang zu verstehen, beschäftigen wir uns mit dem Konzept der Method Resolution Order (MRO). In Python definiert das MRO die Reihenfolge, in der Methoden aufgelöst werden, wenn es um Mehrfachvererbung geht.

In unserem Beispiel ruft Third() First.__init__ auf. Python untersucht jedes Attribut in den Eltern der Klasse von links nach rechts. Für __init__ sucht Python zuerst in „First“, und wenn es dort nicht gefunden wird, prüft es in „Second“.

Mit der ineinandergreifenden Vererbung wird die Situation komplexer. Lesen Sie mehr dazu in Guidos Blogbeitrag zum Thema MRO. Allerdings behält Python im Allgemeinen die Reihenfolge der Vererbung wie geschrieben bei, beginnend mit der untergeordneten Klasse selbst.

Betrachten Sie das folgende Beispiel:

class First(object):
    def __init__(self):
        print("first")

class Second(First):
    def __init__(self):
        print("second")

class Third(First):
    def __init__(self):
        print("third")

class Fourth(Second, Third):
    def __init__(self):
        super(Fourth, self).__init__()
        print("that's it")

Hier wäre das MRO [Vierte, Zweite , Dritter, Erstens].

Es ist wichtig zu beachten, dass Python eine Ausnahme auslöst, wenn es kein kohärentes MRO ermitteln kann, anstatt auf potenziell unerwartete Maßnahmen zurückzugreifen Verhalten.

Darüber hinaus ist es erwähnenswert, dass die bereitgestellten Beispiele keine super()-Aufrufe verwenden. Ihr Zweck besteht darin, zu demonstrieren, wie das MRO aufgebaut ist, und nicht darin, bestimmte Ausgaben zu drucken. Wir empfehlen Ihnen, mit super()-Aufrufen zu experimentieren, um ein tieferes Verständnis des Python-Vererbungsmodells zu erlangen.

Das obige ist der detaillierte Inhalt vonWie löst „super()' Methodenaufrufe in der Python-Mehrfachvererbung auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn