Hallo, ich habe nach Klassenvererbung in Python gesucht und festgestellt, dass sie auch Mehrfachvererbung unterstützt, aber irgendwie problematisch erscheint: o Ich habe ein Beispiel gefunden:
class ParentOne:
def __init__(self):
print "Parent One says: Hello my child!"
self.i = 1
def methodOne(self):
print self.i
class ParentTwo:
def __init__(self):
print "Parent Two says: Hello my child"
class Child(ParentOne, ParentTwo):
def __init__(self):
print "Child Says: hello"
A=Child()
Ausgabe
Child Says: hello
Wenn das Kind ParentOne und ParentTwo erbt, warum werden diese Klassen dann nicht initialisiert? Sollten wir sie manuell innerhalb der ererbten Klasse Child initialisieren? Was ist das richtige Beispiel, damit wir alle Nachrichten sehen können, die nur mit Vererbung gedruckt wurden?
In der Tat ist es etwas komplexer als das; Die Reihenfolge der Methodenauflösung ändert sich dynamisch, um kooperative Aufrufe von super () zu unterstützen. Dieser Ansatz ist in einigen anderen Sprachen mit Mehrfachvererbung als Call-Next-Methode bekannt und leistungsfähiger als der Superaufruf in Sprachen mit Einzelvererbung.
Wie kann es leistungsfähiger sein, wenn es manuell initialisiert werden muss? Entschuldigung für all diese Fragen. Danke im Voraus.
5 Antworten
Dies ist, wofür super
gedacht ist:
class ParentOne():
def __init__(self):
super().__init__()
print("Parent One says: Hello my child!")
self.i = 1
def methodOne(self):
print(self.i)
class ParentTwo():
def __init__(self):
super().__init__()
print("Parent Two says: Hello my child")
class Child(ParentOne, ParentTwo):
def __init__(self):
super().__init__()
print("Child Says: hello")
A=Child()
Druckt
Parent Two says: Hello my child
Parent One says: Hello my child!
Child Says: hello
Die Basisklassenmethoden werden nicht aufgerufen, weil Sie sie nicht aufrufen. Sie müssen dies immer explizit tun, egal ob es eine einzelne Basis oder mehrere Basen gibt. Fügen Sie in diesem einfachen Fall super().__init__()
zu allen drei Klassen hinzu. Weitere allgemeine Ratschläge finden Sie unter Pythons super () gilt als super! .
Das richtige Beispiel ist som, ething Along (Python3):
class BaseClass:
def __init__(self):
print("Initializing base")
class ParentOne(BaseClass):
def __init__(self):
super().__init__()
print("Initializing parent 1")
class ParentTwo(BaseClass):
def __init__(self):
super().__init__()
print("Initializing parent 1")
class Child(ParentOne, ParentTwo):
def __init__(self):
super().__init__()
print("Initializing child")
c = Child()
Python definiert das eingebaute "Super", das die als nächstes aufzurufende Methode korrekt auflöst, indem es eine gut beschriebene Reihenfolge der Methodenauflösung verwendet - es ist also überhaupt nicht "prtoblematisch" - im Gegenteil, es funktioniert recht gut In Eckfällen haben andere Sprachen Probleme - es wird hier beschrieben: http: // www. python.org/download/releases/2.3/mro/
Es ist sehr einfach:
class ParentOne:
def __init__(self):
print "Parent One says: Hello my child!"
self.i = 1
def methodOne(self):
print self.i
class ParentTwo:
def __init__(self):
print "Parent Two says: Hello my child"
class Child(ParentOne, ParentTwo):
def __init__(self):
ParentOne.__init__(self)
ParentTwo.__init__(self)
print "Child Says: hello"
A=Child()
Problem gelöst. Sie können auch super()
verwenden, müssen dies jedoch nicht. Beachten Sie, dass Sie die beiden Methoden nicht mischen können. Sie müssen entweder super () in allen Klassen in der Hierarchie oder keine von ihnen aufrufen.
In Ihrem Beispiel überschreiben Sie speziell die geerbte Methode init mit der Methode init der untergeordneten Klassen. Wenn Sie möchten, dass alle ausgeführt werden, können Sie die Init-Methoden der Eltern explizit mit super () aufrufen.
Wenn Sie die init -Methode nicht überschrieben haben, wird in diesem Beispiel die von ParentOne verwendet.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.