Python: immer statt __init__ verwenden __new__?
-
01-10-2019 - |
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.
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