如果您从@Martijn 的答案中采用元分类方法,@Ned 的答案可以改写得更短(尽管它显然不那么可读,但做同样的事情)。
obj = type('Expando', (object,), {})()
obj.foo = 71
obj.bar = 'World'
或者只是,它与上面使用dict
参数的作用相同:
obj = type('Expando', (object,), {'foo': 71, 'bar': 'World'})()
对于 Python 3,bases
不需要将对象传递给参数(请参阅type
文档)。
但是对于简单的情况,实例化没有任何好处,所以可以这样做:
ns = type('Expando', (object,), {'foo': 71, 'bar': 'World'})
同时,我个人更喜欢一个简单且易读的临时测试配置案例的普通类(即没有实例化):
class ns:
foo = 71
bar = 'World'
更新
在 Python 3.3+ 中,正是OP 所要求的,types.SimpleNamespace
. 只是:
一个简单的object
子类,提供对其命名空间的属性访问,以及有意义的 repr。
与 不同object
,SimpleNamespace
您可以添加和删除属性。如果SimpleNamespace
使用关键字参数初始化对象,则这些参数会直接添加到底层命名空间。
import types
obj = types.SimpleNamespace()
obj.a = 123
print(obj.a) # 123
print(repr(obj)) # namespace(a=123)
但是,在 Python 2 和 Python 3 的 stdlib 中argparse.Namespace
,都有相同的目的:
用于存储属性的简单对象。
通过属性名称和值实现相等,并提供简单的字符串表示。
import argparse
obj = argparse.Namespace()
obj.a = 123
print(obj.a) # 123
print(repr(obj)) # Namespace(a=123)
请注意,两者都可以使用关键字参数进行初始化:
types.SimpleNamespace(a = 'foo',b = 123)
argparse.Namespace(a = 'foo',b = 123)