我想实现一个 wrap 的类 - 而不是子类 - python dict
对象,这样当在后备存储中检测到更改时,我可以重新创建委托的dict对象。每次访问dict进行读取时,我打算检查后备存储中的更改。
假设我要创建一个像这样的对象;我需要采用哪些方法来实现?
答案 0 :(得分:12)
您可以继承ABC(抽象基类)collections.Mapping
(或collections.MutableMapping
,如果您还希望允许使用您的实例的代码来更改模拟/包装字典,例如通过索引任务,pop
等)。
如果你这样做,那么,正如我所指出的文档间接暗示的那样,你需要实现的方法是
__len__
__iter__
__getitem__
(对于Mapping
) - 您应该也实施
__contains__
因为通过委托给dict你包装它可以比ABC必须以其他方式应用的迭代方法快得多。
如果您需要提供MutableMapping
,那么您还需要实施另外两种方法:
__setitem__
__delitem__
答案 1 :(得分:2)
除了已经建议的内容之外,您可能还需要查看UserDict。
对于类似对象的dict示例,您可以阅读django的session implementation,特别是SessionBase
类。
答案 2 :(得分:1)
我认为这取决于您使用的方法。可能是__getitem__
,__setitem__
,__iter__
和__len__
,因为大多数事情都可以用这些来实现。但是您需要查看一些用例,尤其是__iter__
。像这样:
for key in wrapped_dictionary:
do_something(wrapped_dictionary[key])
...如果你在每次迭代中点击数据源会很慢,更不用说如果数据源正在从你下面改变它甚至可能不起作用。因此,您可能希望在那里抛出某种异常并实现iteritems
作为替代,在循环之前加载所有键值对。