Dieser Artikel stellt die Verwendung der Diamantvererbung in der Python-Mehrfachvererbung vor. Ich hoffe, dass er Freunden, die Python lernen, hilfreich sein wird!
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
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.
In dieser Struktur gibt es Verwirrung über die Aufrufreihenfolge?
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()
Ausgabeergebnis
init D... init B... init A... end A... end B... init C... init A... end A... end C... end D...
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()
Ausgabeergebnis:
init D... init B... init C... init A... end A... end C... end B... end D...
Es ist ersichtlich, dass die Aufrufreihenfolge zu diesem Zeitpunkt D->B->C->A ist. Das heißt, die Traversierungsmethode ist Breite zuerst.
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.
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!