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