2013-10-20 181 views
34

是否有任何在Python中定义空对象的快捷方式,或者您是否总是需要创建一个自定义空类的实例?在Python中创建一个空对象

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

回答

52

你可以使用type来创建一个新的类,然后实例化它。像这样:

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

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

实际上,你可以缩短第一线

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

因为默认情况下类型创建从对象继承新式类。

type在Python中用于metaprogramming

但是,如果你只是想创建一个对象的实例。然后,只需创建它的一个实例。就像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' 
>>> 
+1

你甚至可以将第一行缩短为't = type('',(),{})()' – Tiago

9

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

a = object() 

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

a = None 
+11

不知的OP将是什么能与''a''定义成''对象做()''或''None''因为在这种情况,''a''没有名称空间'__dict__'',没有属性可以添加到''a''中,例如''ax = 10''。 – eyquem

26

一个简单的,不那么可怕的前瞻性的方法来创建一个空的(-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!' 
+0

我喜欢这个解决方案,因为不需要给名字 –

+3

嗯,但是它有缺点,分配给'x .__ class __。somefunc' –

17

是的,在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' 
+1

非常好。我希望Python 3中的这一切变得更加简单! – nealmcb