2013-10-20 113 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