Warum werden Konstruktoren tatsächlich "Konstruktoren" genannt? Was ist ihr Zweck und wie unterscheiden sie sich von Methoden in einer Klasse?
Kann es auch mehr als einen __init__
in einer Klasse geben? Ich habe folgendes versucht, kann jemand bitte das Ergebnis erklären?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Ist schließlich __init__
ein Operator Overlader?
__init__
ist ein Initialisierer . Der Python- Konstruktor ist__new__
. Python verwendet die automatische zweiphasige Initialisierung -__new__
gibt ein gültiges, aber (normalerweise) nicht ausgefülltes Objekt zurück (siehebool
ein Gegenbeispiel), das es dann__init__
automatisch aufgerufen hat. Dies vermeidet die Probleme, die Sprachen wie C ++ mit teilweise konstruierten Objekten haben - Sie haben nie eines in Python (obwohl es teilweise initialisiert sein kann). Sie müssen fast nie beide__new__
und__init__
eine Klasse überschreiben .Antworten:
In Python gibt es keine Funktionsüberladung, was bedeutet, dass Sie nicht mehrere Funktionen mit demselben Namen, aber unterschiedlichen Argumenten haben können.
In Ihrem Codebeispiel überladen Sie nicht
__init__()
. Was passiert ist, dass die zweite Definition den Namen erneut an die neue Methode bindet__init__
und die erste Methode unzugänglich macht.In Bezug auf Ihre allgemeine Frage zu Konstruktoren ist Wikipedia ein guter Ausgangspunkt. Für Python-spezifische Dinge empfehle ich die Python-Dokumente .
quelle
__init__
ist, was in der Klasse endet.Warum werden Konstruktoren tatsächlich "Konstruktoren" genannt?
Der Konstruktor (benannt
__new__
) erstellt eine neue Instanz der Klasse und gibt sie zurück. DieC.__new__
Klassenmethode ist also der Konstruktor für die Klasse C.Die
C.__init__
Instanzmethode wird für eine bestimmte Instanz aufgerufen, nachdem sie erstellt wurde, um sie zu initialisieren, bevor sie an den Aufrufer zurückgegeben wird. Diese Methode ist also der Initialisierer für neue Instanzen von C.Wie unterscheiden sie sich von Methoden in einer Klasse?
Wie in der offiziellen Dokumentation angegeben,
__init__
wird nach dem Erstellen der Instanz aufgerufen . Andere Methoden erhalten diese Behandlung nicht.Was ist ihr Zweck?
Der Zweck des Konstruktors
C.__new__
besteht darin, das benutzerdefinierte Verhalten während der Erstellung einer neuenC
Instanz zu definieren .Der Zweck des Initialisierers
C.__init__
besteht darin, die benutzerdefinierte Initialisierung jeder InstanzC
nach ihrer Erstellung zu definieren .Mit Python können Sie beispielsweise Folgendes tun:
Wenn Sie jedoch möchten, dass jede Instanz
Test
ein Attributx
von 10 hat, können Sie diesen Code einfügen__init__
:Jede Instanzmethode (eine Methode, die für eine bestimmte Instanz einer Klasse aufgerufen wird) empfängt die Instanz als erstes Argument. Dieses Argument wird herkömmlicherweise benannt
self
.Klassenmethoden wie der Konstruktor
__new__
erhalten stattdessen die Klasse als erstes Argument.Wenn Sie nun benutzerdefinierte Werte für das
x
Attribut wünschen , müssen Sie diesen Wert nur noch als Argument an Folgendes übergeben__init__
:Ich hoffe, dies wird Ihnen helfen, einige Zweifel auszuräumen, und da Sie bereits gute Antworten auf die anderen Fragen erhalten haben, werde ich hier aufhören :)
quelle
Klassen sind einfach Blaupausen, aus denen Objekte erstellt werden können. Der Konstruktor ist ein Code, der jedes Mal ausgeführt wird, wenn Sie ein Objekt erstellen. Daher ist es nicht sinnvoll, zwei Konstruktoren zu haben. Was passiert ist, dass der zweite den ersten überschreibt.
Normalerweise verwenden Sie sie, um Variablen für dieses Objekt wie folgt zu erstellen:
Sie können also ein Objekt aus dieser Klasse wie folgt erstellen:
Das Testobjekt hat dann ein Objekt namens
some_value
5 in diesem Beispiel.Sie müssen jedoch nicht für jedes Objekt einen Wert festlegen, wie ich es in meinem Beispiel getan habe. Sie können auch Folgendes tun:
dann ist der Wert von some_value 5 und Sie müssen ihn nicht festlegen, wenn Sie das Objekt erstellen.
Das >>> und ... in meinem Beispiel ist nicht das, was Sie schreiben. So würde es in Pyshell aussehen ...
quelle
Coonstruktoren werden automatisch aufgerufen, wenn Sie ein neues Objekt erstellen, wodurch das Objekt "konstruiert" wird. Der Grund, warum Sie mehr als ein Init haben können, ist, dass Namen nur Referenzen in Python sind und Sie jederzeit ändern können, worauf jede Variable verweist (daher dynamische Typisierung).
In Ihrer Klassendefinition wird nur die spätere beibehalten
quelle
In Python gibt es keine Vorstellung von Methodenüberladung. Sie können jedoch einen ähnlichen Effekt erzielen, indem Sie optionale Argumente und Schlüsselwortargumente angeben
quelle