在 Python 中创建具有任意属性的对象的最短方法?

新手上路,请多包涵

嘿,我刚开始想这个,因为我遇到了一段代码,该代码期望一个对象具有一组特定的属性(但没有指定该对象应该是什么类型)。

一种解决方案是创建一个具有代码期望的属性的新类,但是当我调用其他代码也需要具有(其他)属性的对象时,我必须创建越来越多的类。

一个较短的解决方案是创建一个通用类,然后在它的实例上设置属性(对于那些想使用 object 的实例而不是创建一个新类的人来说,这是行不通的,因为 object 实例不允许新属性)。

我想出的最后一个最短的解决方案是创建一个带有构造函数的类,该构造函数采用关键字参数,就像 dict 构造函数一样,然后将它们设置为属性:

 class data:
    def __init__(self, **kw):
        for name in kw:
            setattr(self, name, kw[name])

options = data(do_good_stuff=True, do_bad_stuff=False)

但我忍不住觉得我错过了一些明显的东西……难道没有内置的方法来做到这一点(最好在 Python 2.5 中支持)?

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

阅读 427
2 个回答

使用 __dict__ 可以稍微简化原始代码:

 In [1]: class data:
   ...:     def __init__(self, **kwargs):
   ...:         self.__dict__.update(kwargs)
   ...:

In [2]: d = data(foo=1, bar=2)

In [3]: d.foo
Out[3]: 1

In [4]: d.bar
Out[4]: 2

在 Python 3.3 及更高版本中,此语法由 types.SimpleNamespace 类提供。

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

type('', (), {})() 将创建一个可以具有任意属性的对象。

例子:

 obj = type('', (), {})()
obj.hello = "hello"
obj.world = "world"
print obj.hello, obj.world   # will print "hello world"

type() 用三个参数创建一个新类型。

  • 第一个参数 '' 是新类型的名称。我们不关心名字,所以我们把它留空。

  • 第二个参数 () 是基本类型的元组。这里 object 是隐含的。

  • 第三个参数是新对象属性的字典。我们从没有属性开始,所以它是空的 {}

最后,我们用 () 实例化这个新类型的新实例。

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

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