簡體   English   中英

在 Python 中創建一個空的 object

[英]Creating an empty object in Python

在 Python 中定義空 object 是否有任何快捷方式,或者您是否總是必須創建自定義空 class 的實例?

編輯:我的意思是一個空的 object 可用於鴨子打字。

您可以使用 type 動態創建一個新類,然后實例化它。 像這樣:

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

type 的參數是:類名、基類元組和對象的字典。 其中可以包含函數(對象的方法)或屬性。

您實際上可以將第一行縮短為

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

因為默認情況下,類型會創建從對象繼承的新樣式類。

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

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

創建空(-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!'

“空對象”是什么意思? object實例? 你可以簡單地運行

a = object()

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

a = None

你在問題中說過,但由於沒有答案用代碼提到它,這可能是最干凈的解決方案之一:

class Myobject:
    pass

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

所有提出的解決方案都有些尷尬。

我找到了一種不笨拙但實際上是根據原始設計的方法。

>>> 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 的文檔。

構造一個新的空 Set 對象 如果提供了可選的 iterable 參數,則使用從迭代中獲得的元素更新集合。 iterable 中的所有元素都應該是不可變的,或者可以使用協議一節中描述的協議將其轉換為不可變的,以便自動轉換為不可變的。

例如:

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

在我看來,最簡單的方法是:

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

並且

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

如果有一個空的 object 的期望類型,換句話說,你想創建它但不調用__init__初始化程序,你可以使用__new__

class String(object):
    ...

uninitialized_empty_string = String.__new__(String)

資料來源: https://stackoverflow.com/a/2169191/6639500

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM