是否存在可以保存任何用户属性的现有Python类?

时间:2009-11-13 17:31:37

标签: python struct

当我需要具有不同属性的多个对象时,我可以使用它:

class struct(object):
   def __init__(self,*args,**kwargs):
      for key,val in kwargs.items():
         setattr(self,key,val)

但我想知道是否已经没有内置功能了?

3 个答案:

答案 0 :(得分:9)

除非我不理解您的问题,否则这不是我们使用dict的原因?当然,它的符号略有不同,但对象的属性在内部仍然存储在dict(即__dict__)中。这是一个符号问题。

但是,如果你坚持,那么这是一种方法:

>>> class struct(dict):
...     def __getattribute__(self, key):
...         return self[key]
... 
>>> s = struct(a=5, b=7)
>>> s.a
5

注意我使用的是__getattribute__而不是__getattr__。这样做的原因是,否则我们无法存储名称为getkeys的属性,因为这些是dict定义的方法。

solution by SilentGhost可能效率更高,同样有效,无需使用__getattribute__。然后代码变为:

>>> def struct(**kwargs):
...     return type('Struct', (object,), kwargs)
... 
>>> s = struct(a=5, b=7)
>>> s.a
5

答案 1 :(得分:3)

我不确定你为什么不使用字典。

x = {}
x.update([(1, 2), (3, 4), (5, 6)])
print x

结果

{1: 2, 3: 4, 5: 6}

x.update(a=2, b=4, c=6)

结果

{'a': 2, 'c': 6, 'b': 4}

答案 2 :(得分:3)

我想知道同样的事情。我喜欢x.foo而不是x["foo"]的便利;单个句点比[""]更容易键入(并且更正确)。

dict的优点是任何都可以成为关键。 (好吧,任何东西都可以播放。)但是当我有一堆我想要捆绑在一起的值时,我选择的关键名称无论如何都是有效的标识符。

以下是这个想法的基本版本:

class struct(object):
    pass

x = struct()
x.foo = 1

只要你遇到这个麻烦,你也可以添加处理__init__()的{​​{1}}以方便初始化。但我很懒,而且我希望内置一些东西。

我尝试了这个,这不起作用:

kwargs

我问过它,我得到的答案是x = object() x.foo = 1 # raises AttributeError exception 是Python中所有类型的根;它尽可能小。如果它可以像具有自己的object属性的类实例一样,那么在Python中创建的每个对象都需要附加__dict__

我希望看到__dict__作为Python 3.x的内置添加。但我理解为什么不是这样:保持语言小而干净是一个有价值的目标,而且这个功能很容易编写自己的代码。