如何创建对象并为其添加属性?

新手上路,请多包涵

我想在 Python 中创建一个动态对象(在另一个对象内),然后向它添加属性。

我试过了:

 obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')

但这没有用。

有任何想法吗?

编辑:

我正在从 for 循环设置属性,该循环遍历值列表,例如

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable

在上面的例子中,我会得到 obj.a.attr1obj.a.attr2obj.a.attr3

我使用了 setattr 函数,因为我不知道如何从 for 循环中执行 obj.a.NAME

在上面的示例中,如何根据 p 的值设置属性?


有关它 为什么 不起作用的详细信息,请参阅 Can’t set attributes on instance of “object” class

原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 401
2 个回答

你可以使用我古老的 Bunch 配方,但如果你不想创建一个“bunch 类”,Python 中已经存在一个非常简单的类——所有函数都可以具有任意属性(包括 lambda 函数)。因此,以下工作:

 obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')

与古老的 Bunch 配方相比,清晰度的损失是否可以,这是我当然会留给你的风格决定。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 2.5 许可协议

内置 object 可以实例化,但不能在其上设置任何属性。 (为了这个确切的目的,我希望它可以。)它没有 __dict__ 来保存属性。

我通常只是这样做:

 class Object(object):
    pass

a = Object()
a.somefield = somevalue

如果可以,我给 Object 类一个更有意义的名称,具体取决于我放入其中的数据类型。

有些人做不同的事情,他们使用 dict 的子类,允许属性访问获取键。 ( d.key 而不是 d['key']

编辑:除了你的问题,使用 setattr 就可以了。您不能在 object() 实例上使用 setattr --- 。

 params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)

原文由 FogleBird 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题