如何包装python dict?

时间:2010-08-02 05:35:49

标签: python dictionary

我想实现一个 wrap 的类 - 而不是子类 - python dict对象,这样当在后备存储中检测到更改时,我可以重新创建委托的dict对象。每次访问dict进行读取时,我打算检查后备存储中的更改。

假设我要创建一个像这样的对象;我需要采用哪些方法来实现?

3 个答案:

答案 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作为替代,在循环之前加载所有键值对。

Python docs有项目列表,您可以在其中查找方法和用例。