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
Warum muss ich die Methode getattr überschreiben, um eine Deepcopy von Objekten durchzuführen, die von dieser Klasse zurückgegeben werden
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()
-
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 -
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 -
Tags und Links python class python-2.7 class-method