如何包装python dict?

如何包装python dict?,python,dictionary,Python,Dictionary,我想实现一个类,它将包装pythondict对象,而不是子类,这样当在备份存储中检测到更改时,我就可以重新创建委派的dict对象。我打算在每次访问dict进行读取时检查备份存储中的更改 假设我要创造一个这样的物体;我需要实现哪些方法?您可以将(抽象基类)collections.Mapping(或collections.MutableMapping子类化,如果您还想允许代码使用实例更改模拟/包装的字典,例如通过索引赋值、pop等) 如果您这样做了,那么,正如我指出的文档间接暗示的那样,您需要实现的

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

假设我要创造一个这样的物体;我需要实现哪些方法?

您可以将(抽象基类)
collections.Mapping
(或
collections.MutableMapping
子类化,如果您还想允许代码使用实例更改模拟/包装的字典,例如通过索引赋值、
pop
等)

如果您这样做了,那么,正如我指出的文档间接暗示的那样,您需要实现的方法是

__len__
__iter__
__getitem__
(对于
映射
)--您还应该实现

__contains__
因为通过授权给你正在包装的dict,它可以比ABC必须应用的迭代方法快得多

如果需要提供
可变映射
,则还需要实现另外两种方法:

__setitem__
__delitem__    

我认为这取决于你使用的方法。可能是
\uuuu getitem\uuuuuuuuuuuu
\uuuuuuu setitem\uuuuuuuu
\uuuuuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuu。但是您需要了解一些用例,特别是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。大概是这样的:

for key in wrapped_dictionary:
   do_something(wrapped_dictionary[key])
…如果您在每次迭代中点击数据源,速度会很慢,更不用说如果数据源从您下面更改,它甚至可能不起作用。因此,您可能希望在那里抛出某种异常,并实现
iteritems
,作为替代方案,在循环之前,在一批中加载所有键值对


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

除了已经提出的建议之外,您可能还想看看


对于类似dict的对象的示例,您可以通读django的,特别是
SessionBase
类。

正如所提供的文档链接所建议的那样,UserDict几乎已经被dict子类(自Python 2.2以来)和Alex Martelli建议的ABC方法(自Python 2.6以来)所取代。有什么办法,在Python3中,是否要“批量”转发所有这些方法,而不为每个方法手动复制/粘贴几乎相同的代码?普通的
\uuuu getattr\uuuu
不起作用,因为在类上而不是在实例上查找特殊方法,并且该查找跳过
\uuuu getattr\uuuuu