假设我想使用像对象这样的可变字典来在进程之间传递数据,但是我创建了一个空的" Container"而不是使用内置的字典类型。上课,像这样:
class Container(object):
pass
x = Container()
x.a = 42
x.b = ['Hitch', 'Hiker']
现在,我可以使用x.a
而不是写出x['a']
,这对我来说似乎更清晰一些。假设我不希望循环关键值,那么使用这个"容器"是否有任何重大缺点。与标准词典?
答案 0 :(得分:3)
是的,这是一个完美的pythonic事情。实际上它是recommended in the Python tutorial。
答案 1 :(得分:3)
如果你想这样做并仍然可以获得字典的优点,我会将dict
子类化:
class Container(dict):
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
self[name] = value
x = Container()
x.a = 42
x.b = ['Hitch', 'Hiker']
print(x)
打印:
{'b': ['Hitch', 'Hiker'], 'a': 42}
您可能希望单独处理现有属性,因此您仍然可以更改它们:
def __setattr__(self, name, value):
if name not in dir(self):
self[name] = value
else:
super().__setattr__(name, value)
答案 2 :(得分:2)
对于快速简单的容器,我没有看到任何错误。主要的缺点是你没有得到所有其他dict方法(比如.get()
,.items()
等),你的密钥必须是有效的Python标识符。
请注意,还有一些库提供了类似的功能和更多便利功能(例如attrdict)。
答案 3 :(得分:1)
恰恰相反;标准库的argparse
模块中的{{1}}类本质上就是这样一个容器(在忽略一些内部使用的魔法和私有方法之后)。