在Python中是否存在特殊的类用于创建空对象?我尝试使用object(),但它不允许我添加字段。 我希望能像这样使用它:
obj = EmptyObject()
obj.foo = 'far'
obj.bar = 'boo'
我每次(在几个独立的脚本中)都需要像这样定义新类吗?
class EmptyObject:
pass
我使用Python 2.7。
在Python中是否存在特殊的类用于创建空对象?我尝试使用object(),但它不允许我添加字段。 我希望能像这样使用它:
obj = EmptyObject()
obj.foo = 'far'
obj.bar = 'boo'
我每次(在几个独立的脚本中)都需要像这样定义新类吗?
class EmptyObject:
pass
我使用Python 2.7。
types.SimpleNamespace
是在 Python 3.3 中引入的,旨在实现这一具体目的。文档还展示了一个简单的方法来在 Python 中自己实现它,以便将其添加到您的 Python 3.3 之前的设置中,并像已经存在一样使用它(请注意,实际的实现是用 C 完成的)。
class SimpleNamespace (object):
def __init__ (self, **kwargs):
self.__dict__.update(kwargs)
def __repr__ (self):
keys = sorted(self.__dict__)
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
return "{}({})".format(type(self).__name__, ", ".join(items))
def __eq__ (self, other):
return self.__dict__ == other.__dict__
当然,如果您不需要它的几个功能,一个简单的 class Empty: pass
就可以做到同样的事情。
如果你正在寻找一个占位符对象,可以向其中添加任意静态成员,那么我推荐使用空的lambda函数。
obj = lambda: None # Dummy function
obj.foo = 'far'
obj.bar = 'boo'
print obj.foo, obj.bar
# far boo
注意:obj
不是类的对象,object 并不意味着 class instance,因为在 Python 中,类和函数在运行时与类实例一样作为对象处理。
lambda: 0
。尽管如此,我仍然不会使用它,因为这使得很难弄清楚你首先为什么要创建这个 lambda
。 - Martijn Pieters在 Python 2.7 中没有 types.SimpleNamespace
,您可以使用 collections.namedtuple()
来代替不可变对象:
>>> from collections import namedtuple
>>> FooBar = namedtuple('FooBar', 'foo bar')
>>> FooBar('bar', 'foo')
FooBar(foo='bar', bar='foo')
argparse.Namespace
:>>> from argparse import Namespace
>>> o = Namespace(foo='bar')
>>> o.bar = 'foo'
>>> o
Namespace(bar='foo', foo='bar')
另请参阅:如何创建一个对象并添加属性?
type
函数动态创建具有所需字段的新类型,如下所示:x = type('empty', (object,), {'foo': 'bar'})
x.bar = 3
print(x.foo)
然而,这并不完全是您想要的,因为它将具有自定义类型,而不是空类型。
import
来获取现有的EmptyObject
,净节省也将很小。 - user4815162342