如何包装一个python字典?

9 投票
3 回答
6199 浏览
提问于 2025-04-16 02:10

我想创建一个类,这个类不是去继承Python的dict对象,而是把它“包裹”起来。这样的话,当我发现后端存储的数据有变化时,就可以重新创建这个被包裹的字典对象。我打算在每次读取字典的时候,检查一下后端存储的数据有没有变化。

假设我真的要做这样一个对象,我需要实现哪些方法呢?

3 个回答

1

我觉得这要看你用什么方法。一般来说,__getitem____setitem____iter____len__ 这几个方法是最常用的,因为很多功能都可以通过它们来实现。不过,你可能还需要看看一些具体的使用场景,特别是关于 __iter__ 的部分。比如说:

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

...如果你在每次循环时都去访问数据源,那这个过程会很慢,更别提如果数据源在你使用的时候发生了变化,可能连代码都无法正常运行。所以你可能需要在这里抛出一些异常,并实现 iteritems 作为替代方案,先一次性加载所有的键值对,然后再进行循环处理。

你可以在Python文档中查看方法和使用案例。

3

除了已经提到的内容,你可能还想看看 UserDict

如果想了解一个类似字典的对象,可以看看 Django 的 会话实现,特别是 SessionBase 这个类。

13

你可以创建一个新的类,这个类是从 ABC(抽象基类)中的 collections.Mapping 继承而来的。如果你还想让使用你这个类的代码能够修改模拟的字典,比如通过索引赋值、pop 等操作,那么你可以选择从 collections.MutableMapping 继承。

如果你这样做了,那么根据我提到的文档,实际上你需要实现的方法是:

__len__
__iter__
__getitem__

(对于 Mapping)-- 你还应该实现:

__contains__

因为通过委托给你所包装的字典,这样的操作会比 ABC 需要采用的迭代方法快得多。

如果你需要提供一个 MutableMapping,那么你还需要实现另外两个方法:

__setitem__
__delitem__    

撰写回答