如何将Python字典转换为字符串?

9
我希望实现一个类,它将“包装”Python的dict对象,而不是子类化它,这样当检测到后端存储中的更改时,我可以重新创建委托的字典对象。我打算在每次访问字典进行读取时检查后备存储中的更改。
假设我要创建一个像这样的对象;我需要实现什么方法?
3个回答

13
你可以继承ABC(抽象基类)collections.Mapping(或collections.MutableMapping,如果你还想允许代码使用你的实例来更改模拟/封装字典,例如通过索引赋值,pop等)。
如果你这样做了,那么正如我间接指出的文档所示,你需要实现的方法是:
__len__
__iter__
__getitem__

(针对一个“映射”)-- 您应该还要实现
__contains__

因为通过委托给你所包装的字典,可以比ABC必须应用的迭代方法更快地完成。
如果您需要提供MutableMapping,则还需要实现2个方法:
__setitem__
__delitem__    

1
在Python 3中,有没有一种方法可以“批量”转发所有这些方法,而不是为每个方法手动复制/粘贴几乎相同的代码?普通的__getattr__无法工作,因为特殊方法是在类上查找而不是实例上查找,并且该查找跳过了__getattr__ - max

3
除了已经建议的内容之外,您可能还想查看UserDict
如果您需要类似于字典的对象示例,可以阅读django的会话实现,特别是SessionBase类。

正如提供的文档链接所建议的那样,自 Python 2.2 起,UserDict 已经被 dict 子类所取代,并且在 Alex Martelli 上面提到的 ABC 方法(自 Python 2.6 起)中也得到了应用。 - NeilenMarais

1

我认为这取决于你使用哪些方法。大多数事情可能都可以用__getitem____setitem____iter____len__来实现。但是你需要查看一些用例,特别是与__iter__有关的用例。就像这样:

for key in wrapped_dictionary:
   do_something(wrapped_dictionary[key])

如果在每次迭代中都访问数据源,那么速度会很慢,更不用说如果数据源正在发生变化,它可能甚至无法正常工作。因此,在循环之前,您可能需要抛出某种异常并实现iteritems作为替代方案,一次性加载所有键值对,然后再循环遍历它们。

Python 文档 中有项目列表,您可以查找方法和用例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接