类`object`的实例

时间:2011-07-16 18:55:29

标签: python

我希望创建一个内置类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

  •   

    使用派生类可以避免输入引号

  • 此外,有时自动完成工作

3 个答案:

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

我将您链接到文档,但它们已关闭。