当我需要具有不同属性的多个对象时,我可以使用它:
class struct(object):
def __init__(self,*args,**kwargs):
for key,val in kwargs.items():
setattr(self,key,val)
但我想知道是否已经没有内置功能了?
答案 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__
。这样做的原因是,否则我们无法存储名称为get
和keys
的属性,因为这些是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的内置添加。但我理解为什么不是这样:保持语言小而干净是一个有价值的目标,而且这个功能很容易编写自己的代码。