Seite 1 von 1
Verständnisfrage zu `__new__()`
Verfasst: Montag 14. April 2014, 13:07
von mutetella
Hallo,
wenn ich beim Deserialisieren eine Klasseninstanz wiederherstelle, mache ich ja etwas in der Art:
Dieses ``cls.__new__(cls)`` ist mir dabei nicht ganz klar. Weshalb rufe ich die `__new__()` Methode von `cls` auf und übergebe derselben wieder `cls`? Stattdessen könnte ich ja auch die `__new__()` Methode von `object` oder irgendeiner anderen Klasse, die von `object` stammt, aufrufen. Wird also die `__new__()` Methode letztlich nur als "Steigbügel" verwendet, um ein "jungfräuliches" Exemplar der Klasse zu erhalten, die ich übergebe? Wenn dem so ist, weshalb gibt es dann nicht eine builtin Funktion `new()`?
mutetella
Re: Verständnisfrage zu `__new__()`
Verfasst: Montag 14. April 2014, 13:40
von BlackJack
@mutetella: Welche eingebaute Funktion `new()`? Und Du rufst `__new__()` auf der Klasse auf weil diese Methode auf der Klasse, oder einer Elternklasse davon, überschrieben worden sein kann, und damit etwas anderes macht als `object.__new__()`. `cls` wird als erstes Argument übergeben, weil die Methode das so erwartet.
Re: Verständnisfrage zu `__new__()`
Verfasst: Montag 14. April 2014, 14:19
von mutetella
BlackJack hat geschrieben:... weil diese Methode [...] überschrieben worden sein kann, ...
Ok, das ist ein Grund, daran hatte ich nicht gedacht. Danke.
mutetella
Re: Verständnisfrage zu `__new__()`
Verfasst: Montag 14. April 2014, 15:39
von Sirius3
obwohl, beim Deserialisieren will man ja gerade nicht, dass irgend etwas ausgeführt wird, sondern exakt den Zustand wiederherstellen, der serialisiert wurde. Welche Schwierigkeiten es dabei gibt, kannst Du in der pickle-Dokumentation nachlesen

Re: Verständnisfrage zu `__new__()`
Verfasst: Montag 14. April 2014, 15:48
von BlackJack
@Sirius3: Ich denke mal mutetella bezieht sich auf `pickle`, denn dort gibt es Code der ein neues Objekt so erstellt:
Code: Alles auswählen
def load_newobj(self):
args = self.stack.pop()
cls = self.stack[-1]
obj = cls.__new__(cls, *args)
self.stack[-1] = obj
Re: Verständnisfrage zu `__new__()`
Verfasst: Montag 14. April 2014, 16:00
von mutetella
@BlackJack
Nein, ich hab' eine Funktion `deserialize()` gemacht, die ich via `json.load()` übergebe. Aber letztlich derselbe Hintergrund.
mutetella