Heim > Backend-Entwicklung > Python-Tutorial > Diamantvererbung in Python-Mehrfachvererbung

Diamantvererbung in Python-Mehrfachvererbung

angryTom
Freigeben: 2020-02-12 12:45:31
nach vorne
4202 Leute haben es durchsucht

Dieser Artikel stellt die Verwendung der Diamantvererbung in der Python-Mehrfachvererbung vor. Ich hoffe, dass er Freunden, die Python lernen, hilfreich sein wird!

Diamantvererbung in Python-Mehrfachvererbung

Vererbung ist eine wichtige Methode der objektorientierten Programmierung. Durch Vererbung können Unterklassen die Funktionen von übergeordneten Klassen erweitern. In Python kann eine Klasse von mehr als einer übergeordneten Klasse erben. Dies wird als Pythons Mehrfachvererbung bezeichnet.

Syntax

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
    pass
Nach dem Login kopieren

Rhombus-Vererbung

Empfohlenes Lernen: Python-Video-Tutorial

Vererbung auf mehreren Ebenen Bei Verwendung zusammen mit der Mehrfachvererbung treten komplexe Vererbungsbeziehungen auf, beispielsweise die Mehrfachvererbung.

Darunter wird auch die Diamantenvererbung erscheinen. Wie unten gezeigt. Diamantvererbung in Python-Mehrfachvererbung

In dieser Struktur gibt es Verwirrung über die Aufrufreihenfolge?

  • D-> A->C (Tiefe zuerst)
  • D->B->C->A (Breite zuerst)

Beantworten wir diese Frage.

Zum Beispiel:

class A():
    def __init__(self):
        print('init A...')
        print('end A...')

class B(A):
    def __init__(self):
        print('init B...')
        A.__init__(self)
        print('end B...')

class C(A):
    def __init__(self):
        print('init C...')
        A.__init__(self)
        print('end C...')

class D(B, C):
    def __init__(self):
        print('init D...')
        B.__init__(self)
        C.__init__(self)
        print('end D...')

if __name__ == '__main__':
    D()
Nach dem Login kopieren

Ausgabeergebnis

init D...
init B...
init A...
end A...
end B...
init C...
init A...
end A...
end C...
end D...
Nach dem Login kopieren

Aus dem Ausgabeergebnis lautet die Aufrufsequenz: D->B->A-> ;C-> ;A. Es ist ersichtlich, dass B und C gemeinsam von A erben und A zweimal aufgerufen wird. Es ist nicht nötig, A zweimal anzurufen.

Tatsächlich hängen die Hauptursachen der oben genannten Probleme alle mit der MRO (Method Resolution Order) zusammen, die auch Method Resolution Order genannt wird und hauptsächlich verwendet wird Um die Auflösung während der Mehrfachvererbung zu bestimmen, wird ein Algorithmus namens C3 verwendet. Die Grundidee ist, dass zuerst die Breite verwendet und das Attribut vermeidet Dieselbe Klasse wird mehrmals aufgerufen, um die erforderlichen Attribute und Methoden zu finden.

Wie kann man also verhindern, dass eine Methode in der übergeordneten Klasse der obersten Ebene mehrmals aufgerufen wird? Super() ist im Wesentlichen eine Klasse, die MRO-Informationen intern aufzeichnet Der C3-Algorithmus stellt sicher, dass dieselbe Klasse nur einmal durchsucht wird, wodurch vermieden wird, dass die Methode in der übergeordneten Klasse der obersten Ebene mehrmals ausgeführt wird. Der obige Code kann wie folgt geändert werden:

class A():
    def __init__(self):
        print('init A...')
        print('end A...')

class B(A):
    def __init__(self):
        print('init B...')
        super(B, self).__init__()
        print('end B...')

class C(A):
    def __init__(self):
        print('init C...')
        super(C, self).__init__()
        print('end C...')

class D(B, C):
    def __init__(self):
        print('init D...')
        super(D, self).__init__()
        print('end D...')

if __name__ == '__main__':
    D()
Nach dem Login kopieren

Ausgabeergebnis:

init D...
init B...
init C...
init A...
end A...
end C...
end B...
end D...
Nach dem Login kopieren

Es ist ersichtlich, dass die Aufrufreihenfolge zu diesem Zeitpunkt D->B->C->A ist. Das heißt, die Traversierungsmethode ist Breite zuerst.

Ergänzende Inhalte

Python-Klassen werden in zwei Typen unterteilt, einer heißt klassische Klasse und der andere heißt Klasse im neuen Stil. Beide unterstützen die Mehrfachvererbung, die Reihenfolge der Vererbung ist jedoch unterschiedlich.

  • Neue Stilklasse: Eine vom Objekt geerbte Klasse. (Zum Beispiel: Klasse A (Objekt)), geerbt mit der Breitensuche (d. h. zuerst horizontale Suche, dann Aufwärtssuche).
  • Klassische Klasse: Eine Klasse, die nicht vom Objekt erbt. (Zum Beispiel: Klasse A()), erben Sie mit der Suchmethode Depth-First (d. h. gehen Sie zuerst tief in die linke Seite des Vererbungsbaums, kehren Sie dann zurück und suchen Sie dann die rechte Seite).

In Python 2.x gibt es zwei Arten von Klassen: klassische Klassen und neue Klassen. Python3.x ist voll von Klassen neuen Stils.

Weitere Tutorials zum Thema Python finden Sie in der Spalte Python-Tutorials.

Das obige ist der detaillierte Inhalt vonDiamantvererbung in Python-Mehrfachvererbung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage