Python Multiple Inheritance
Table of Contents
In diesem Lernprogramm lernen Sie die Mehrfachvererbung in Python kennen und erfahren, wie Sie sie in Ihrem Programm verwenden können. Sie erfahren auch etwas über die mehrstufige Inheritance und die Reihenfolge der Methodenauflösung.
Python Multiple Inheritance
Eine Klasse kann in Python, ähnlich wie in C++, von mehr als einer Basisklasse abgeleitet werden. Dies wird als Mehrfachvererbung bezeichnet.
Bei der Mehrfach “Inheritance” werden die Eigenschaften aller Basisklassen in die abgeleitete Klasse vererbt. Die Syntax für die Mehrfach “Inheritance” ist ähnlich wie bei der Einfach Inheritance.
Beispiel
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Hier die MultiDerived Klasse ist abgeleitet von Base1 und Base2 Klassen.
Das MultiDerived Klasse erbt von beiden Base1 und Base2 Klassen.
Python Multilevel Inheritance
Wir können auch von einer abgeleiteten Klasse erben. Dies wird als mehrstufige Vererbung bezeichnet. Sie kann in Python beliebig tief sein.
Bei der mehrstufigen Vererbung werden Eigenschaften der Basisklasse und der abgeleiteten Klasse an die neue abgeleitete Klasse vererbt.
Ein Beispiel mit entsprechender Visualisierung finden Sie unten.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Hier die Derived1 Klasse ist abgeleitet von der Base Klasse, und die Derived2 Klasse ist abgeleitet von der Derived1 Klasse.
Method Resolution Order in Python
Jede Klasse in Python ist abgeleitet von der object
Klasse. Sie ist der base Typ in Python.
Technisch gesehen sind also alle anderen Klassen, ob eingebaut oder benutzerdefiniert, abgeleitete Klassen und alle Objekte sind Instanzen der object
Klasse.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
Im Szenario Mehrfach inheritance wird jedes angegebene Attribut zuerst in der aktuellen Klasse gesucht. Wenn es nicht gefunden wird, wird die Suche in übergeordneten Klassen in der Tiefe zuerst, von links nach rechts fortgesetzt, ohne dieselbe Klasse zweimal zu durchsuchen.
Also im obigen Beispiel von MultiDerived
Klasse, die Suchreihenfolge ist[MultiDerived
, Base1
, Base2
, object
]. Diese Ordnung wird auch Linearisierung von genannt MultiDerived
Klasse und das Regelwerk, das verwendet wird, um diese Reihenfolge zu finden, heißt Method Resolution Order (MRO).
MSP muss lokale Vorrang verhindern und auch Monotonie sicherstellen. Es sorgt dafür, dass eine Klasse immer vor ihren Eltern erscheint. Wenn es mehrere Eltern gibt, ist die Reihenfolge die gleiche wie bei Tupeln von Basisklassen.
MRO einer Klasse kann als das angesehen werden __mro__
attribut oder die mro()
Methode. Ersteres gibt ein Tupel zurück, während letzteres eine Liste zurückgibt.
>>> MultiDerived.__mro__ (<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>) >>> MultiDerived.mro() [<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
Hier ist ein etwas komplexeres Beispiel für mehrfach Inheritance und seine Visualisierung zusammen mit dem MRO.
# Demonstration von MRO class X: pass class Y: pass class Z: pass class A(X, Y): pass class B(Y, Z): pass class M(B, A, Z): pass # Output: # [<class '__main__.M'>, <class '__main__.B'>, # <class '__main__.A'>, <class '__main__.X'>, # <class '__main__.Y'>, <class '__main__.Z'>, # <class 'object'>] print(M.mro())
Output
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Um den aktuellen Algorithmus zur Berechnung der MRO zu erfahren, besuchen Sie Diskussion über MRO.