【问题标题】:Is there an existing Python class that can hold any user attributes?是否存在可以保存任何用户属性的现有 Python 类?
【发布时间】:2010-12-16 09:22:10
【问题描述】:

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

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

但我想知道是否已经没有内置的?

【问题讨论】:

标签: python struct


【解决方案1】:

我也想知道同样的事情。我享受x.foo而不是x["foo"]带来的便利;单个句点比所有[""] 更容易输入(并且更正确)。

dict 的优点是 anything 可以是键。 (嗯,任何可散列的东西。)但是当我有一堆值我想捆绑在一起时,我选择的键名无论如何都是有效的标识符。

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

class struct(object):
    pass

x = struct()
x.foo = 1

只要你要这么麻烦,还不如加上处理kwargs__init__(),方便初始化。但我很懒,我希望有一些内置的东西。

我试过了,还是不行:

x = object()
x.foo = 1   # raises AttributeError exception

我问了一下,得到的答案是object是Python中所有类型的根;它尽可能小。如果它可以像一个类实例一样具有自己的__dict__ 属性,那么在 Python 中创建的每个对象都需要一个附加的__dict__

我希望看到 struct 添加为 Python 3.x 的内置。但我明白为什么不是这样:保持语言简洁干净是一个值得的目标,而且这个功能很容易自己编写代码。

【讨论】:

  • 不错的分析。让我补充两点:(1)object 的这个属性,它没有__dict__,也可以用于其他类,通过定义__slots__(参见docs.python.org/reference/datamodel.html#slots 了解更多); (2) 关于你的最后一段:import this 声明:应该有一个——最好只有一个——明显的方法。
【解决方案2】:

除非我不理解您的问题,否则这不是我们使用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

【讨论】:

    【解决方案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}
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2018-07-05
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多