Ich möchte einen Symboltyp implementieren, der die bereits vorhandenen Symbole (in _sym_table
gespeichert) speichert und sie zurückgibt, wenn sie existieren, oder neue erstellen. Der Code:
Aber wenn ich copy.deepcopy
in einer Liste solcher Symbol
Instanzen aufruft, wird eine Exception ausgelöst:
Fehlermeldungen:
%Vor%Meine Fragen sind also:
__new__
Methoden erstellen? copy.deepcopy
verwendet wird? Vielen Dank!
Ein Problem besteht darin, dass deepcopy
und copy
keine Möglichkeit haben zu wissen, welche Argumente an __new__
übergeben werden sollen. Daher arbeiten sie nur mit Klassen, die keine Konstruktorargumente erfordern.
Der Grund, warum Sie __init__
Argumente haben können, ist, dass __init__
beim Kopieren eines Objekts nicht aufgerufen wird, aber __new__
muss aufgerufen werden, um das neue Objekt zu erstellen.
Wenn Sie also das Kopieren steuern wollen, müssen Sie die speziellen Methoden __copy__
und __deepcopy__
definieren:
Übrigens Singletons sind evil und nicht wirklich in Python benötigt.
Mir scheint, dass Sie möchten, dass die Symbolinstanzen Singletons sind. Deepcopy sollte jedoch verwendet werden, wenn Sie eine exakte Kopie einer Instanz wünschen, d. H. Eine andere Instanz, die dem Original entspricht.
Die Verwendung hier widerspricht also dem Zweck von decopy. Wenn Sie es trotzdem zum Laufen bringen wollen, können Sie die Methode __deepcopy__ für Symbol .