Python 2.7中是否有一个类似于:
的类x = AttrDict(foo=1, bar=2)
x.foo -> 1
x.bar -> 2
对于任意属性/构造函数关键字?
dict
已关闭,但没有属性访问,也没有这么好的构造函数语法。
命名元组也很接近,但我不想为每个属性组合创建一个新类型。
有时这样的东西会很方便。我可以在一分钟内自己创建一个,但这听起来像Python中可能存在的东西。
答案 0 :(得分:4)
在Python 3.3中,标准解决方案是types.SimpleNamespace
,但这并未向后移植到2.7。一个非常相似的类型,argparse.Namespace
存在于2.7中。它有点模糊但有文件证明,因此可以依赖。
答案 1 :(得分:2)
与子类化解决方案一起,您可以执行以下操作:
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
看起来有点奇怪,但应该有效。它利用了python对象__dict__
>>>x = AttrDict(foo=1, bar=2)
>>>x.foo
1
>>>x.bar
2
>>>x.baz = 3
>>>x.baz
3
>>>x.missing
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'AttrDict' object has no attribute 'missing'
答案 2 :(得分:1)
你可以将dict
子类化为这样的事情:(感谢@delnan,标准库中已经有两个这样的对象)
class AttrDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, val):
self.__setitem__(attr, val)
...
>>> x = AttrDict(foo=1, bar=2)
>>> x.foo
1
>>> x.bar
2
>>> x.spam = 'eggs'
>>> x.spam
'eggs'