Frage

Ich verstehe, wie sowohl __init__ und __new__ Arbeit. Ich frage mich, ob es etwas __init__ ist, kann diesen __new__ tut nicht?

d. Verwendung von __init__ durch das folgende Muster kann ersetzt werden:

class MySubclass(object):
    def __new__(cls, *args, **kwargs):
        self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
        // Do __init__ stuff here
        return self

Ich frage, wie ich diesen Aspekt des Python OO machen mag, paßt besser in meinem Kopf.

War es hilfreich?

Lösung 2

Eine mögliche Antwort von Guidos Post (danke @ fraca7):

  

Zum Beispiel in der Beize Modul wird __new__ verwendet Instanzen zu erstellen, wenn deserialisieren Objekte. In diesem Fall werden Instanzen erstellt, aber die __init__ Methode wird nicht aufgerufen.

Jede andere ähnliche Antworten?


Ich nehme diese Antwort als ‚Ja‘ zu meiner Frage:

  

Ich frage mich, ob es etwas ist, dass __init__ __new__ tun können, nicht?

Ja, im Gegensatz zu __new__, Aktionen, die Sie in der __init__ Methode setzen werden nicht während des Unpickling durchgeführt werden. __new__ kann diese Unterscheidung nicht machen.

Andere Tipps

die Klasse einer Klasse So ist in der Regel type, und wenn Sie rufen Sie die Class() Methode auf __call__() Klasse Griffe Class das. Ich glaube, type.__call__() ist mehr oder weniger wie folgt umgesetzt:

def __call__(cls, *args, **kwargs):
    # should do the same thing as type.__call__
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):
        obj.__init__(*args, **kwargs)
    return obj

Die direkte Antwort auf Ihre Frage nicht ist, kann die Dinge, die __init__() tut (ändern / „initialize“ eine bestimmte Instanz) ist eine Teilmenge der Dinge, die __new__() tun kann (oder auf sonstige Weise auswählen, was das Objekt es will, alles tun, es auf das Objekt will, bevor das Objekt zurückgegeben wird).

Es ist bequem, beide Methoden zu haben, jedoch. Die Verwendung von __init__() ist einfacher (es muss nicht alles schaffen, es muss nichts zurück), und ich glaube, es ist am besten Praxis ist immer __init__() verwenden, wenn Sie einen bestimmten Grund zu verwenden __new__() haben.

Nun, suche __new__ vs __init__ auf Google hat mir gezeigt, this .

Lange Rede kurzer Sinn, __new__ gibt eine neue Objektinstanz, während __init__ nichts zurückgibt und nur die Teilnehmer, initialisiert.

EDIT:. Um tatsächlich Ihre Frage beantworten, sollten Sie nie außer Kraft zu setzen __new__ müssen, wenn Sie unveränderliche Typen sind Subklassen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top