Więc po prostu ustalić, czuję, rozumiem różnicę między copy
vs. deepcopy
w module kopiowania i Użyłem copy.copy
i copy.deepcopy
przed sukcesem, ale jest to pierwszy raz, kiedy rzeczywiście poszedł o przeciążeniu __copy__
i __deepcopy__
metody. Przeglądałem już i przeglądałem wbudowane moduły Pythona, aby wyszukać wystąpienia funkcji __copy__
i __deepcopy__
(np. sets.py
, decimal.py
i fractions.py
), ale nadal nie jestem w 100% pewny, że mam to dobrze .Jaki jest właściwy sposób na przesłonięcie operacji kopiowania/kopiowania na obiekcie w Pythonie?
Oto mój scenariusz:
Mam obiekt konfiguracji, która głównie składa się tylko z prostych właściwości (choć będzie to potencjalnie mieć list innych niż prymitywnych obiektów w nim). Początkowo zamierzam utworzyć instancję jednego obiektu konfiguracyjnego z domyślnym zestawem wartości. Ta konfiguracja zostanie przekazana do wielu innych obiektów (aby zapewnić, że wszystkie obiekty zaczynają się od tej samej konfiguracji). Jednak gdy rozpocznie się interakcja użytkownika, każdy obiekt będzie musiał móc dostosować konfiguracje niezależnie, nie wpływając na konfiguracje drugiej strony (co oznacza dla mnie, że muszę wprowadzić deepcopys z mojej początkowej konfiguracji do przekazania).
Oto przykładowy obiekt:
class ChartConfig(object):
def __init__(self):
#Drawing properties (Booleans/strings)
self.antialiased = None
self.plot_style = None
self.plot_title = None
self.autoscale = None
#X axis properties (strings/ints)
self.xaxis_title = None
self.xaxis_tick_rotation = None
self.xaxis_tick_align = None
#Y axis properties (strings/ints)
self.yaxis_title = None
self.yaxis_tick_rotation = None
self.yaxis_tick_align = None
#A list of non-primitive objects
self.trace_configs = []
def __copy__(self):
pass
def __deepcopy__(self, memo):
pass
Co jest właściwym sposobem realizacji copy
i deepcopy
metod na tym obiekcie w celu zapewnienia copy.copy
i copy.deepcopy
dać mi właściwego zachowania? Aktualnie używam Pythona 2.6.2.
Z góry dziękuję!
Czy to działa? Czy są jakieś problemy? –
Myślałem, że wciąż mam problemy z dzielonymi referencjami, ale jest to całkowicie możliwe, że zawiodłem gdzie indziej. Sprawdzę podwójnie na podstawie wpisu @ MortenSiebuhr, kiedy otrzymam szansę i zaktualizuję wyniki. –
Z mojego obecnie ograniczonego rozumowania oczekiwałbym, że copy.deepcopy (ChartConfigInstance) zwróci nowe wystąpienie, które nie będzie miało żadnych wspólnych odniesień z oryginałem (bez ponownego wgłębiania samego siebie). Czy to jest nieprawidłowe? – emschorsch