#python #attributes #deep-copy
#python #атрибуты #глубокое копирование
Вопрос:
Почему атрибут deepcopy dict теряет доступ к точечному атрибуту?
Есть ли способ сохранить доступ после исправления… кстати, используемые мной dicts являются многоуровневыми глубокими AttrDict …
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
class XX(AttrDict): pass
In [49]: from attr_dict import *
In [51]: x = XX({'s':1,'e':2})
In [52]: x
Out[52]: {'s': 1, 'e': 2}
In [53]: x.s
Out[53]: 1
In [54]: x.e
Out[54]: 2
In [55]: import copy
In [56]: y = copy.deepcopy(x)
In [57]: y.s
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-57-1faf550cffec> in <module>
----> 1 y.s
AttributeError: 'XX' object has no attribute 's'
In [58]: y['s']
Out[58]: 1
Я могу добавить метод :
def rebind(self) : self.__dict__ = self
но тогда я должен вызвать его после вызова deepcopy .. и, вероятно, будет работать только для одного уровня..
Не могу найти, как это сделать в deepcopy()
Комментарии:
1. Я бы сказал, что реализация deepcopy распознает его как a
dict
и просто создаетdict
. Реализуйте__deepcopy__
, чтобы он возвращал то, что вам нужно.2. хм… но если вы посмотрите на реализацию для точечного доступа, копировать нечего!!
3. Потому что копия не имеет своего
__dict__
набора для себя.4. @sten что вы имеете в виду? Вы должны вернуть экземпляр самого себя, удалив все его содержимое. Ключевой проблемой здесь является возврат экземпляра правильного типа.