Ich habe 'Dive Into Python' gelesen und im Kapitel über Klassen gibt es dieses Beispiel:
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
Der Autor sagt dann, wenn Sie die __init__
Methode überschreiben möchten , müssen Sie das übergeordnete Element explizit __init__
mit den richtigen Parametern aufrufen .
- Was wäre, wenn diese
FileInfo
Klasse mehr als eine Ahnenklasse hätte?- Muss ich alle
__init__
Methoden der Ahnenklassen explizit aufrufen ?
- Muss ich alle
- Muss ich dies auch mit einer anderen Methode tun, die ich überschreiben möchte?
python
overriding
superclass
liewl
quelle
quelle
Antworten:
Das Buch ist in Bezug auf das Aufrufen von Unterklassen und Oberklassen etwas veraltet. Es ist auch ein wenig veraltet in Bezug auf die Unterklasse der integrierten Klassen.
Es sieht heutzutage so aus:
Beachte das Folgende:
Sie können direkt integrierten Klassen Unterklasse, wie
dict
,list
,tuple
usw.Die
super
Funktion behandelt das Aufspüren der Oberklassen dieser Klasse und das entsprechende Aufrufen von Funktionen.quelle
In jeder Klasse, von der Sie erben müssen, können Sie eine Schleife für jede Klasse ausführen, die beim Initiieren der untergeordneten Klasse initialisiert werden muss. Ein Beispiel, das kopiert werden kann, ist möglicherweise besser zu verstehen.
quelle
Child.__init__
notwendig wäre. Wenn ich es aus dem Beispiel entferne, druckt mein Kind immer noch "Oma". Wird der Großeltern-Init nicht von derParent
Klasse behandelt?Es ist nicht wirklich haben , um den Anruf
__init__
Methoden der Basisklasse (n), aber Sie in der Regel wollen , es zu tun , weil die Basisklassen werden einige wichtige Initialisierungen tun es , die für die restlichen Klassen Methoden zur Arbeit benötigt werden.Bei anderen Methoden hängt es von Ihren Absichten ab. Wenn Sie dem Verhalten der Basisklassen nur etwas hinzufügen möchten, müssen Sie die Basisklassenmethode zusätzlich zu Ihrem eigenen Code aufrufen. Wenn Sie das Verhalten grundlegend ändern möchten, rufen Sie möglicherweise nicht die Methode der Basisklasse auf und implementieren alle Funktionen direkt in der abgeleiteten Klasse.
quelle
Wenn die FileInfo-Klasse mehr als eine Vorfahrenklasse hat, sollten Sie auf jeden Fall alle ihre __init __ () -Funktionen aufrufen. Sie sollten dasselbe auch für die Funktion __del __ () tun, die ein Destruktor ist.
quelle
Ja, Sie müssen
__init__
für jede übergeordnete Klasse anrufen . Gleiches gilt für Funktionen, wenn Sie eine Funktion überschreiben, die in beiden Elternteilen vorhanden ist.quelle