我已将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
等)?
答案 0 :(得分:6)
对于这种用法,你不应该继承dict
类,而是使用Python标准库的collections
模块中的抽象类。
您应该对MutableMapping
抽象类进行子类化并覆盖以下方法:__getitem__
,__setitem__
,__delitem__
,__iter__
和__len__
,
所有那些通过使用内部字典。抽象基类确保所有其他方法都使用这些方法。
class MyDict(collections.MutableMapping):
def __init__(self):
self.d = {}
# other initializations ...
def __setitem__(self, key, value):
self.d[key] = value
self.modified = true
...
答案 1 :(得分:1)
pop, popitem, clear, update
未通过__setitem__
和__delitem__
实施。
您还必须重新定义它们。
我可以建议看看OrderedDict的实现。