在Python中创建一个空对象

问题描述 投票:0回答:10

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

编辑:我的意思是一个可用于鸭子打字的空对象。

python oop
10个回答
154
投票

是的,在Python 3.3中添加了SimpleNamespace

与对象不同,使用 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'
    

130
投票
您可以使用 type 动态创建一个新类,然后实例化它。像这样:

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

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

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

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

因为默认情况下类型会创建继承自对象的新样式类。

type

在Python中用于
元编程

但是如果你只想创建一个对象的实例。然后,只需创建它的一个实例。就像莱杰洛特建议的那样。

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

>>> 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' >>>
    

73
投票
创建空对象的一种简单且看起来不那么可怕的方法是利用函数是 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!'
编辑

在现代的 Python 3.3+ 世界中,正确的答案可能是使用

SimpleNamespace


24
投票
您在问题中说过,但由于没有答案用代码提到它,这可能是最干净的解决方案之一:

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

10
投票
“空物体”是什么意思?类

object

的实例?你可以简单地运行

a = object()

或者您的意思是初始化空引用?然后你就可以使用

a = None
    

4
投票
所有提出的解决方案都有些尴尬。

我找到了一种不hacky但实际上是按照原始设计的方法。

>>> 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'

请参阅此处unittest.mock的文档。


4
投票
你可以使用

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

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

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

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

2
投票
在我看来,最简单的方法是:

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


-1
投票
如果有想要的空对象类型,换句话说,你想创建它但不调用

__init__

 初始化器,你可以使用 
__new__
:

class String(object): ... uninitialized_empty_string = String.__new__(String)
来源:

https://stackoverflow.com/a/2169191/6639500

© www.soinside.com 2019 - 2024. All rights reserved.