Warum werden Konstruktoren tatsächlich "Konstruktoren" genannt?
Der Konstruktor (benannt __new__) erstellt eine neue Instanz der Klasse und gibt sie zurück. Die C.__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 neuen CInstanz zu definieren .
Der Zweck des Initialisierers C.__init__besteht darin, die benutzerdefinierte Initialisierung jeder Instanz Cnach ihrer Erstellung zu definieren .
Mit Python können Sie beispielsweise Folgendes tun:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Wenn Sie jedoch möchten, dass jede Instanz Testein Attribut xvon 10 hat, können Sie diesen Code einfügen __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
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 xAttribut wünschen , müssen Sie diesen Wert nur noch als Argument an Folgendes übergeben __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
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 :)
__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 (sieheboolein 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 .