Есть ли способ переопределить метод __copy__
для класса таким образом, что некоторые атрибуты копируются только в качестве ссылки , а другие атрибуты фактически скопировано
Чтобы уточнить, что я имею в виду, вот мое предположение о том, как это можно сделать. Рассмотрим класс Spam
:
class Spam:
def __init__(self, val=0, val2=0):
self.eggs = []
self.foo = []
self.val = val
self.val2 = val2
Предположим, мы хотели убедиться, что при вызове copy.copy
(т.е. мелкой копии) для объекта Spam
его атрибут eggs
был глубоко скопирован в новый объект (так что что мутации в атрибуте исходного объекта не изменяют атрибут eggs
копии). «Почему бы вам просто не deepcopy
весь объект тогда?» - потому что, в отличие от eggs
, мы хотим, чтобы атрибут foo
копировался как ссылка (чтобы изменения в нем были виден всем копиям).
Тогда будет ли следующий подход верным?
to_be_copied = ['eggs'] # States which attributes are to be copied
def __copy__(self):
copy_ = Spam()
for attr in self.__dict__:
if attr in Spam.to_be_copied:
# Make an actual copy of the attribute
copy_.__dict__[attr] = copy.copy(self.__dict__[attr])
else:
# Copy reference
copy_.__dict__[attr] = self.__dict__[attr]
return copy_