如何包装一个python字典?
我想创建一个类,这个类不是去继承Python的dict
对象,而是把它“包裹”起来。这样的话,当我发现后端存储的数据有变化时,就可以重新创建这个被包裹的字典对象。我打算在每次读取字典的时候,检查一下后端存储的数据有没有变化。
假设我真的要做这样一个对象,我需要实现哪些方法呢?
3 个回答
1
我觉得这要看你用什么方法。一般来说,__getitem__
、__setitem__
、__iter__
和 __len__
这几个方法是最常用的,因为很多功能都可以通过它们来实现。不过,你可能还需要看看一些具体的使用场景,特别是关于 __iter__
的部分。比如说:
for key in wrapped_dictionary:
do_something(wrapped_dictionary[key])
...如果你在每次循环时都去访问数据源,那这个过程会很慢,更别提如果数据源在你使用的时候发生了变化,可能连代码都无法正常运行。所以你可能需要在这里抛出一些异常,并实现 iteritems
作为替代方案,先一次性加载所有的键值对,然后再进行循环处理。
13
你可以创建一个新的类,这个类是从 ABC(抽象基类)中的 collections.Mapping
继承而来的。如果你还想让使用你这个类的代码能够修改模拟的字典,比如通过索引赋值、pop
等操作,那么你可以选择从 collections.MutableMapping
继承。
如果你这样做了,那么根据我提到的文档,实际上你需要实现的方法是:
__len__
__iter__
__getitem__
(对于 Mapping
)-- 你还应该实现:
__contains__
因为通过委托给你所包装的字典,这样的操作会比 ABC 需要采用的迭代方法快得多。
如果你需要提供一个 MutableMapping
,那么你还需要实现另外两个方法:
__setitem__
__delitem__