Python中存储键值对:类与字典的对比

5 投票
5 回答
5952 浏览
提问于 2025-04-17 08:02

我需要定义一些键值对参数,用来配置一个类的行为。我的要求有两个:

  • 能够以编程的方式处理这些参数
  • 能够进行更具体的配置,覆盖一些已有的值。

为了满足第一个要求,自然的做法是使用一个 dict(这样我就可以用 for 循环遍历键、值或者项目),但为了满足第二个要求,似乎使用类的层次结构更合适,这样可以利用属性查找机制来完成工作(而且我还可以使用属性来处理一些值,这样会更方便)。

有没有办法同时兼顾这两者的优点呢?


在看完评论后,我发现其实不需要可变性(我不会改变已经创建实例的值),这只是为了静态配置。不过,我可能需要在更具体的实例中添加新值。

我想最后我可以直接使用 dict.copy 加上 dict.update 来处理这些具体实例(我可以不使用属性)。

5 个回答

1

这就是你需要的吗?

class my_dict(dict):
    def __getattr__(self, name):
        return self[name]
    def __setattr__(self, name, value):
        self[name] = value

d = my_dict()
d.key = "value"
print d.key       #>>>value

for k,v in d.items():
    print k,v     #>>>key value
2

根据Fabio的评论,我想说这两者其实是可以同时存在的,因为在Python中,几乎所有东西都是对象(包括类!)。

一个明显的解决办法是——再次引用Fabio——创建一个dict的子类。另一个办法是从collections.abc容器开始自己定义一个类(使用抽象基类abc)并不是必须的,但这可能是从零开始实现自己容器的最Pythonic方式)。

希望对你有帮助!

1

如果你能使用 Python 3.3,ChainMap 正是你需要的东西。

http://docs.python.org/3.3/library/collections#collections.ChainMap

它基本上是一个字典的列表,会依次在每个字典中查找给定的键,直到找到匹配的为止。

其实,这里有在 2.7 版本中使用它的代码:

http://code.activestate.com/recipes/305268-chained-map-lookups/

撰写回答