Python中是否存在空类?
在Python中有没有特别的类可以用来创建空对象?我试过用object(),但它不让我添加属性。我想像这样使用它:
obj = EmptyObject()
obj.foo = 'far'
obj.bar = 'boo'
我每次(在几个独立的脚本中)都需要像这样定义一个新类吗?
class EmptyObject:
pass
我使用的是Python 2.7
4 个回答
2
你可以使用 type
函数动态创建一个新类型,并指定你想要的字段,像这样:
x = type('empty', (object,), {'foo': 'bar'})
x.bar = 3
print(x.foo)
不过,这并不是你完全想要的,因为它会生成一个自定义类型,而不是一个空类型。
7
在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')
另外,你可以看看这个链接,了解如何创建一个对象并给它添加属性:如何创建一个对象并给它添加属性?
8
如果你想找一个可以放置任意静态成员的占位对象,那么我找到的最接近的就是一个空的 lambda 函数。
obj = lambda: None # Dummy function
obj.foo = 'far'
obj.bar = 'boo'
print obj.foo, obj.bar
# far boo
记住: obj
不是一个类的对象,对象 并不意味着 类实例,因为在 Python 中,类和函数在运行时都是对象,就像类的实例一样。
10
types.SimpleNamespace
是在 Python 3.3 版本中引入的,目的是为了方便使用。文档中还展示了一种简单的方法,让你可以自己在 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
也能达到同样的效果。