Python中存储键值对:类与字典的对比
我需要定义一些键值对参数,用来配置一个类的行为。我的要求有两个:
- 能够以编程的方式处理这些参数
- 能够进行更具体的配置,覆盖一些已有的值。
为了满足第一个要求,自然的做法是使用一个 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/