python中是否存在空类?

sbe*_*kov 8 python python-2.7

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

obj = EmptyObject()
obj.foo = 'far'
obj.bar = 'boo'
Run Code Online (Sandbox Code Playgroud)

我应该每次(在几个独立的脚本中)定义这样的新类吗?

class EmptyObject:
    pass
Run Code Online (Sandbox Code Playgroud)

我用python2.7

pok*_*oke 9

types.SimpleNamespacePython 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__
Run Code Online (Sandbox Code Playgroud)

但是,当然,如果你不需要它的一些功能,一个简单的class Empty: pass功能也是如此.

  • @ maggot092正如我所说,你可以轻松地将实现添加到你的Python 2项目并使用它,就像它在那里... (4认同)
  • OP担心不得不在每个脚本中重复两行.在每个剧本中重复这9行似乎是一种比疾病更糟糕的治疗方法. (2认同)

the*_*eye 7

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

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

print obj.foo, obj.bar
# far boo
Run Code Online (Sandbox Code Playgroud)

记住: obj不是一个类的对象,对象并不意味着类的实例,因为在Python类和函数是在运行时的对象,就像类实例

  • 嗯......虽然这当然很有趣,但我确实不希望在生产代码中看到这一点. (8认同)

jfs*_*jfs 6

types.SimpleNamespacePython 2.7 中没有,您可以使用collections.namedtuple()不可变对象:

>>> from collections import namedtuple
>>> FooBar = namedtuple('FooBar', 'foo bar')
>>> FooBar('bar', 'foo')
FooBar(foo='bar', bar='foo')
Run Code Online (Sandbox Code Playgroud)

或者argparse.Namespace

>>> from argparse import Namespace
>>> o = Namespace(foo='bar')
>>> o.bar = 'foo'
>>> o
Namespace(bar='foo', foo='bar')
Run Code Online (Sandbox Code Playgroud)

另请参阅如何创建对象并向其添加属性?