Подтвердить что ты не робот

Создание пустого объекта в Python

Есть ли ярлыки для определения пустого объекта в Python или вам всегда нужно создать экземпляр пользовательского пустого класса?

Изменить: я имею в виду пустой объект, который можно использовать для печати утки.

4b9b3361

Ответ 1

Вы можете использовать тип для создания нового класса "на лету", а затем создать его экземпляр. Например:

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

Аргументами типа являются: Имя класса, кортеж базовых классов и словарь объектов. Что может содержать функции (методы объекта) или атрибуты.

Фактически вы сократите первую строку до

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

Потому что по умолчанию type создает новые классы стиля, которые наследуют объект.

type используется в Python для metaprogramming.

Но если вы просто хотите создать экземпляр объекта. Затем просто создайте экземпляр. Как предлагает лейслот.

Создание экземпляра нового класса, подобного этому, имеет важное различие, которое может быть полезно.

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

Ответ 2

Да, в 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'

Ответ 3

Одним простым, менее страшным способом создания пустого (-ish) объекта является использование того факта, что функции являются объектами в Python, включая лямбда-функции:

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

Ответ 4

Что вы подразумеваете под "пустым объектом"? Экземпляр класса object? Вы можете просто запустить

a = object()

или, может быть, вы имеете в виду инициализацию нулевой ссылки? Затем вы можете использовать

a = None

Ответ 5

Все предложенные решения несколько неловки.

Я нашел способ, который не является хакерским, но на самом деле соответствует оригинальному дизайну.

>>> 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 "/opt/prezi/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 здесь.

Ответ 6

Создает новый пустой объект Set. Если указан необязательный итеративный параметр, обновляется набор с элементами, полученными в результате итерации. Все элементы в итерируемых должны быть неизменяемыми или преобразовываться в неизменяемые с использованием протокола, описанного в разделе Протокол для автоматического преобразования в неизменяемое.

Пример:

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