Как обнаружить модификацию dict?
Я подклассифицировал dict
и должен обнаружить все его изменения.
(Я знаю, что не могу обнаружить модификацию сохраненного значения на месте. Это нормально.)
Мой код:
def __setitem__(self, key, value):
super().__setitem__(key, value)
self.modified = True
def __delitem__(self, key):
super().__delitem__(key)
self.modified = True
Проблема заключается в том, что он работает только для простого назначения или удаления. Он не обнаруживает изменений, сделанных pop()
, popitem()
, clear()
и update()
.
Почему __setitem__
и __delitem__
обходят, когда элементы добавляются или удаляются? Должен ли я переопределять все эти методы (pop
и т.д.)?
Ответы
Ответ 1
Для этого использования вы не должны подклассифицировать класс dict
, но вместо этого используйте абстрактные классы с помощью collections
модуля стандартной библиотеки Python.
Вы должны подклассифицировать абстрактный класс MutableMapping
и переопределить следующие методы: __getitem__
, __setitem__
, __delitem__
, __iter__
и __len__
,
все это с помощью внутреннего dict. Абстрактный базовый класс гарантирует, что все остальные методы будут использовать их.
class MyDict(collections.MutableMapping):
def __init__(self):
self.d = {}
# other initializations ...
def __setitem__(self, key, value):
self.d[key] = value
self.modified = true
...
Ответ 2
pop, popitem, clear, update
не реализованы через __setitem__
и __delitem__
.
Вы также должны переопределить их.
Я могу предложить посмотреть реализацию OrderedDict.