python中是否存在空类?

python中是否存在空类?,python,python-2.7,Python,Python 2.7,python中是否存在创建空对象的特殊类?我尝试了object(),但它不允许我添加字段。 我想这样使用它: obj = EmptyObject() obj.foo = 'far' obj.bar = 'boo' x = type('empty', (object,), {'foo': 'bar'}) x.bar = 3 print(x.foo) 我应该每次(在几个独立的脚本中)这样定义新类吗 class EmptyObject: pass 我使用python2.7如果您正在寻找一

python中是否存在创建空对象的特殊类?我尝试了object(),但它不允许我添加字段。 我想这样使用它:

obj = EmptyObject()
obj.foo = 'far'
obj.bar = 'boo'
x = type('empty', (object,), {'foo': 'bar'})
x.bar = 3
print(x.foo)
我应该每次(在几个独立的脚本中)这样定义新类吗

class EmptyObject:
    pass

我使用python2.7

如果您正在寻找一个可以添加任意静态成员的占位符对象,那么我得到的最接近的是一个空lambda函数

obj = lambda: None    # Dummy function
obj.foo = 'far'
obj.bar = 'boo'

print obj.foo, obj.bar
# far boo

请记住:
obj
不是类的对象,对象并不意味着类实例,因为在Python中,类和函数在运行时都是对象,就像类实例一样,您可以使用
type
函数动态创建一个新类型,其中包含您想要的字段,如下所示:

obj = EmptyObject()
obj.foo = 'far'
obj.bar = 'boo'
x = type('empty', (object,), {'foo': 'bar'})
x.bar = 3
print(x.foo)
但这并不完全是您想要的,因为它将有一个自定义类型,而不是空类型。

是在Python3.3中引入的,正是为了达到这个目的。文档还展示了一种用Python自己实现它的简单方法,因此您可以将它添加到Python 3.3之前的设置中,并像在那里一样使用它(请注意,实际实现是用C完成的):


但是当然,如果您不需要它的一些特性,那么简单的
类Empty:pass
也可以这样做。

没有
类型。在Python 2.7中,您可以使用
集合.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')

另请参见,

这是两行相当不言而喻的代码,我认为重复它没有问题。即使您必须添加一个新的
导入
,以获取现有的
清空对象
,净节省量也很小。您甚至可以将其放在一行,不是吗?您考虑过吗?我感觉你在重新发明一个轮子。@kojiro如果OP想动态添加属性,比如JavaScript对象,那该怎么办?@2rs2ts就是这样。就我个人而言,我认为这是一个产生问题的好方法。为什么要争论?您也可以使用
lambda:0
。尽管如此,我还是不会使用它,因为这让我很难理解为什么要首先创建
lambda
。嗯。。。虽然这确实很有趣,但我绝对不想在生产代码中看到这一点。我对独创性的支持,但我同意Lukas Graf的观点,这个解决方案不适合生产不幸的是,正如我说过的,我使用python2。7@maggot092正如我所说,您可以轻松地将实现添加到Python2项目中,并像使用它一样使用它……在本例中,正如您也说过的,与定义Emty类相比,我看不出有什么优势。好的,最大的优势是使用一种在未来Python版本中确实存在的类型,因此,使用等效类型肯定会让您的意图更加清晰。OP担心在每个脚本中必须重复两行琐碎的内容。相反,在每个脚本中重复这9行似乎是比疾病更糟糕的治疗方法。而且,它会在每次调用时创建一个新类型,这相当昂贵。酷-使用argparse的另一个原因!