Python-Mehrfachvererbung
Python-Mehrfachvererbung
In diesem Tutorial erfahren Sie mehr über die Mehrfachvererbung in Python und wie Sie sie in Ihrem Programm verwenden. Außerdem erfahren Sie mehr über die Vererbung auf mehreren Ebenen und die Reihenfolge der Methodenauflösung.
Python-Mehrfachvererbung
Eine Klasse kann in Python von mehr als einer Basisklasse abgeleitet werden, ähnlich wie in C++. Dies wird als Mehrfachvererbung bezeichnet.
Bei der Mehrfachvererbung werden die Eigenschaften aller Basisklassen in die abgeleitete Klasse vererbt. Die Syntax für Mehrfachvererbung ist ähnlich wie für Einfachvererbung.
Beispiel
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
Hier die MultiDerived Klasse wird von Base1 abgeleitet und Base2 Klassen.
Die MultiDerived Klasse erbt von beiden Base1 und Base2 Klassen.
Python-Vererbung auf mehreren Ebenen
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 Merkmale der Basisklasse und der abgeleiteten Klasse in die neue abgeleitete Klasse vererbt.
Ein Beispiel mit entsprechender Visualisierung finden Sie weiter unten.
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Hier die Derived1 Klasse wird von der Base abgeleitet Klasse und Derived2 Klasse wird von Derived1 abgeleitet Klasse.
Reihenfolge der Methodenauflösung in Python
Jede Klasse in Python wird von object
abgeleitet Klasse. Es ist der grundlegendste Typ in Python.
Technisch gesehen sind also alle anderen Klassen, entweder eingebaute oder benutzerdefinierte, abgeleitete Klassen und alle Objekte sind Instanzen von object
Klasse.
# Output: True
print(issubclass(list,object))
# Output: True
print(isinstance(5.5,object))
# Output: True
print(isinstance("Hello",object))
Beim Mehrfachvererbungsszenario wird jedes angegebene Attribut zuerst in der aktuellen Klasse gesucht. Wenn sie nicht gefunden wird, wird die Suche mit der Tiefe zuerst und von links nach rechts in Elternklassen fortgesetzt, ohne dass dieselbe Klasse zweimal durchsucht wird.
Also im obigen Beispiel von MultiDerived
Klasse ist die Suchreihenfolge [MultiDerived
, Base1
, Base2
, object
]. Diese Ordnung wird auch als Linearisierung von MultiDerived
bezeichnet Klasse und der Satz von Regeln, die verwendet werden, um diese Reihenfolge zu finden, wird als Method Resolution Order (MRO) bezeichnet .
MRO muss eine lokale Vorrangordnung verhindern und auch Monotonie bereitstellen. Es stellt sicher, dass eine Klasse immer vor ihren Eltern erscheint. Bei mehreren Eltern ist die Reihenfolge dieselbe wie bei Tupeln von Basisklassen.
MRO einer Klasse kann als __mro__
angesehen werden -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 Mehrfachvererbung und seine Visualisierung zusammen mit dem MRO.
# Demonstration of 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())
Ausgabe
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Um den tatsächlichen Algorithmus zur Berechnung von MRO zu erfahren, besuchen Sie Diskussion über MRO.
Python