Deep Copy-Fehler beim Kopieren eines benutzerdefinierten Objekts

8

Ich habe eine Klasse, die ein Wörterbuch in ein Objekt wie dieses konvertiert

%Vor%

Wenn ich versuche, eine tiefe Kopie des Objekts zu erstellen, habe ich diesen Fehler

%Vor%

Aber ich überschreibe getattr Funktion in Dict2obj Klasse Ich konnte einen tiefen Kopiervorgang durchführen. Siehe Beispiel unten

%Vor%

Warum muss ich die Methode getattr überschreiben, um eine Deepcopy von Objekten durchzuführen, die von dieser Klasse zurückgegeben werden

    
Anurag Sharma 28.10.2015, 09:52
quelle

1 Antwort

6

Das Problem tritt bei Ihrer ersten Klasse auf, weil copy.deepcopy versucht, getattr(x, "__deepcopy__", None) aufzurufen. Die Bedeutung des dritten Arguments besteht darin, dass das dritte Argument zurückgegeben wird, wenn das Attribut für das Objekt nicht existiert.

Dies ist in der Dokumentation für getattr() -

angegeben
  

getattr(object, name[, default])

     

Gibt den Wert des benannten Attributs des Objekts zurück. name muss eine Zeichenfolge sein. Wenn die Zeichenfolge der Name eines der Attribute des Objekts ist, ist das Ergebnis der Wert dieses Attributs. Zum Beispiel entspricht getattr (x, 'foobar') x.foobar. Wenn das benannte Attribut nicht existiert, wird der Standardwert zurückgegeben, falls dies angegeben wird, andernfalls wird AttributeError ausgelöst .

Dies funktioniert, wenn das zugrunde liegende __getattr__ das AttributeError erhöht und das default Argument für den Funktionsaufruf getattr() bereitgestellt wurde, wird das AttributeError von der Funktion getattr() abgefangen und gibt das Standardargument zurück , sonst lässt es% code_de% platzen. Beispiel -

%Vor%

Aber in Ihrem Fall, da Sie AttributeError direkt dict.__getitem__ zuweisen, wenn der Name nicht im Dictionary gefunden wird, wird ein __getattr__ , nicht ein KeyError ausgelöst, und daher wird es nicht behandelt AttributeError und Ihr getattr() schlägt fehl.

Du solltest die copy.deepcopy() in deinem KeyError behandeln und dann getattr erhöhen. Beispiel -

%Vor%     
Anand S Kumar 28.10.2015, 10:10
quelle