我希望创建一个内置类object
的实例,并将其用作某些变量的容器(如C ++中的struct
):
Python 3.2 (r32:88445, Mar 25 2011, 19:56:22)
>>> a=object()
>>> a.f=2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'f'
有没有办法比这更容易实现:
>>> class struct():
... '''Container'''
...
>>> a=struct()
>>> a.f=2
>>> a.f
2
>>>
更新
我需要一个容器来容纳一些变量,但我不想使用
dict - 能够写a.f = 2
而不是a['f'] = 2
使用派生类可以避免输入引号
此外,有时自动完成工作
答案 0 :(得分:4)
不,你必须继承object
来获得一个可变对象。确保在python 2.x中明确地这样做:
class Struct(object):
pass
虽然可能使用内置容器更好,但仅仅因为它从语法中清楚地知道它是什么。
无法分配object
的实例的原因是它们没有__dict__
或__slots__
属性,这两个地方可以存储实例数据。
>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
基本上这相当于声明__slots__ = []
。
如果您知道自己希望Struct
拥有的所有字段,则 可以使用slots
制作可变namedtuple
的数据结构:< / p>
>>> class Foo(object):
... __slots__ = ['a', 'b', 'c']
...
>>> f = Foo()
>>> f.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: a
>>> f.a = 5
>>> f.a
5
但您只能为__slots__
中列出的属性名称指定值:
>>> f.d = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'd'
答案 1 :(得分:4)
我认识到对dicts的情绪,因此我经常使用NamedTuples或类。在Cookbook中,Bunch
提供了很好的简写,允许您在一个中进行声明和赋值:
point = Bunch(x=x, y=y, squared=y*y)
point.x
印刷的食谱(2ed)对此进行了广泛的讨论。
恕我直言,对象没有插槽且没有dict的原因是可读性:如果你先使用(匿名)对象存储坐标,然后再存储另一个存储客户端数据的对象,你可能会感到困惑。两个类定义清楚地表明哪一个是哪个。 Bunches没有。
答案 2 :(得分:3)
是。它被称为dict。
structything = {}
structything['f'] = 2
print structything['f']
print structything.get('f')
我将您链接到文档,但它们已关闭。