Python中是否存在空类?

11 投票
4 回答
4520 浏览
提问于 2025-04-17 22:59

在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 也能达到同样的效果。

撰写回答