Я протянул dict
в простом способе прямого доступа это значение с d.key
нотации вместо d['key']
:Как создать класс, который __getattr__ правильно подбирается?
class ddict(dict):
def __getattr__(self, item):
return self[item]
def __setattr__(self, key, value):
self[key] = value
Теперь, когда я пытаюсь замариновать его, он будет вызывать __getattr__
найти __getstate__
, который не является ни настоящее, ни необходимо. То же самое будет происходить на unpickling с __setstate__
:
>>> import pickle
>>> class ddict(dict):
... def __getattr__(self, item):
... return self[item]
... def __setattr__(self, key, value):
... self[key] = value
...
>>> pickle.dumps(ddict())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __getattr__
KeyError: '__getstate__'
Как я должен изменить класс ddict
для того, чтобы быть правильно pickable?
Извините, но все в этом ответе неверно. Pickle пытается получить доступ к методу '__getstate__' в экземпляре, после чего проконсультируется с методом' __getattr__'. Это пытается получить доступ к ключу с помощью этого имени в сопоставлении и не выполняется с помощью KeyError; это не является нормальным исключением для разборки доступа к атрибуту. –
Далее, на 'dict' нет метода' __getattr__', поэтому вызов 'super()' не будет выполнен. Этот метод является необязательным, он используется только как резервный крючок для отсутствия атрибутов. –
Далее, вся точка перехвата '__setattr__' должна переопределить процесс назначения нормального атрибута и вместо этого перенаправить на назначение словаря. Вызов версии 'super()' поражает эту цель. –