类似于Dict的属性集合

时间:2014-01-17 20:41:20

标签: python

Python 2.7中是否有一个类似于:

的类
x = AttrDict(foo=1, bar=2)
x.foo  -> 1
x.bar  -> 2

对于任意属性/构造函数关键字?

  • dict已关闭,但没有属性访问,也没有这么好的构造函数语法

  • 命名元组也很接近,但我不想为每个属性组合创建一个新类型。

有时这样的东西会很方便。我可以在一分钟内自己创建一个,但这听起来像Python中可能存在的东西。

3 个答案:

答案 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'