Überschreiben von __new__ und __init__ in Python [duplizieren]

8

So wie ich es verstehe, unterscheidet sich __init__ von einem Konstruktor in Java, weil __init__ nur ein Objekt initialisiert, das bereits implizit konstruiert wurde (weil __init__ nach __new__ aufgerufen wird). Alles, was ich jemals definieren musste, hat diese letztere Eigenschaft eines 'Konstruktors' in Java verwendet. Was wäre ein Fall, in dem ein Programmierer __new__ ? Überschreiben möchte?

BEARBEITEN : Für die Aufnahme frage ich teilweise, weil ich mich frage, was wäre der Vorteil / Nachteil zu überschreiben neu vs mit einer separaten Klassenmethode in der akzeptierten Beantworte diese Frage:

"Moving Beyond Factories" in Python

    
chimeracoder 27.08.2010, 12:22
quelle

2 Antworten

11

__new__ passiert tatsächlich, bevor ein Objekt existiert. Es ist eine statische Methode des Typs. Verwendung von __new__ ist, wenn Sie die Erstellung neuer Objekte, z. ein Singleton. Wenn Ihr __new__ immer dieselbe Instanz eines Objekts zurückgibt, handelt es sich um ein Singleton. Das kannst du nicht mit __init__ machen.

Im Allgemeinen sollten Sie in "python so wie es Guido beabsichtigt hat" nicht __new__ mehr als einmal pro Monat verwenden:)

    
abyx 27.08.2010, 12:26
quelle
3

__new__ dient zum Erstellen einer neuen Objektinstanz, __init__ dient zum Initialisieren.

Ich denke, wenn Sie einen unveränderlichen Typ entwerfen, müssen Sie ihn in __new__ initialisieren, siehe zB namedtuple (auch Pythons Verwendung von __new__ und __init__? ).

    
Constantin 27.08.2010 12:34
quelle

Tags und Links