Verständnisfrage zu `__new__()`

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

wenn ich beim Deserialisieren eine Klasseninstanz wiederherstelle, mache ich ja etwas in der Art:

Code: Alles auswählen

new = cls.__new__(cls)
new.__dict__ = any_kwargs
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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

BlackJack hat geschrieben:... weil diese Methode [...] überschrieben worden sein kann, ...
Ok, das ist ein Grund, daran hatte ich nicht gedacht. Danke.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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 ;-)
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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack
Nein, ich hab' eine Funktion `deserialize()` gemacht, die ich via `json.load()` übergebe. Aber letztlich derselbe Hintergrund.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten