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.

2
BugShotGG 6 Okt. 2012 im 00:01

5 Antworten

Beste Antwort

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
7
unutbu 5 Okt. 2012 im 20:26

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! .

4
user395760user395760 5 Okt. 2012 im 20:08

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.

2
Lennart Regebro 6 Okt. 2012 im 02:43

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.

2
TimothyAWiseman 5 Okt. 2012 im 20:07