在 Python 中创建空对象

在 Python 中是否有定义空对象的快捷方式,或者您总是必须创建自定义空类的实例?

编辑: 我的意思是一个空对象可用于鸭类型。

129465 次浏览

你说的“空对象”是什么意思? 类 object的实例? 你可以简单地运行

a = object()

或者也许你是指初始化为空引用? 然后你可以使用

a = None

您可以使用 type 动态创建一个新类,然后将其实例化,如下所示:

>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>

要输入的参数是: 类名、基类的元组和对象的字典。它可以包含函数(对象的方法)或属性。

实际上可以将第一行缩短为

>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)

因为默认情况下,type 创建从对象继承的新样式类。

type在 Python 中用于 元编程

但是如果你只想创建一个对象的实例。然后,创建它的一个实例。就像 Lejlot 说的那样。

创建这样一个新类的实例有一个重要的区别,这个区别可能很有用。

>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'

在哪里:

>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>>

创建一个空(- ish)对象的一个简单、看起来不那么吓人的方法是利用函数是 Python 中的对象这一事实,包括 Lambda 函数:

obj = lambda: None
obj.test = "Hello, world!"

例如:

In [18]: x = lambda: None


In [19]: x.test = "Hello, world!"


In [20]: x.test
Out[20]: 'Hello, world!'

Yes, in Python 3.3 SimpleNamespace was added

与对象不同,使用 SimpleNamespace 可以添加和删除属性。如果使用关键字参数初始化 SimpleNamespace 对象,则将这些参数直接添加到基础命名空间。

例如:

import types


x = types.SimpleNamespace()
x.happy = True


print(x.happy) # True


del x.happy
print(x.happy) # AttributeError. object has no attribute 'happy'

所有提出的解决方案都有些令人尴尬。

我发现了一种不是粗糙的方法,而是根据最初的设计。

>>> from mock import Mock
>>> foo = Mock(spec=['foo'], foo='foo')
>>> foo.foo
'foo'
>>> foo.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../virtualenv/local/lib/python2.7/site-packages/mock/mock.py", line 698, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'bar'

See the documentation of unittest.mock here.

构造一个新的 空的 Set 对象。如果提供了可选的迭代参数,则使用从迭代中获得的元素更新集合。迭代中的所有元素都应该是不可变的,或者可以使用协议部分中描述的协议转换为不可变的,以便自动转换为不可变的。

例如:

myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)

You said it in the question, but as no answer mentioned it with code, this is probably one of the cleanest solutions:

class Myobject:
pass


x = Myobject()
x.test = "Hello, world!"  # working


In my opinion, the easiest way is:

def x():pass
x.test = 'Hello, world!'

你可以用

x = lambda: [p for p in x.__dict__.keys()]

然后

x.p1 = 2
x.p2 = "Another property"

之后

x()
# gives
# ['p1', 'p2']

And

[(p, getattr(x,p)) for p in x()]
# gives
# [('p1', 2), ('p2', 'Another property')]

如果有一个需要的空对象类型,换句话说,你想创建它,但不调用 __init__初始化器,你可以使用 __new__:

class String(object):
...


uninitialized_empty_string = String.__new__(String)

资料来源: https://stackoverflow.com/a/2169191/6639500