Атрибут DeepCopy Dict теряет доступ к точечному атрибуту?

#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 что вы имеете в виду? Вы должны вернуть экземпляр самого себя, удалив все его содержимое. Ключевой проблемой здесь является возврат экземпляра правильного типа.