Есть ли ярлыки для определения пустого объекта в Python или вам всегда нужно создать экземпляр пользовательского пустого класса?
Изменить: я имею в виду пустой объект, который можно использовать для печати утки.
Есть ли ярлыки для определения пустого объекта в Python или вам всегда нужно создать экземпляр пользовательского пустого класса?
Изменить: я имею в виду пустой объект, который можно использовать для печати утки.
Вы можете использовать тип для создания нового класса "на лету", а затем создать его экземпляр. Например:
>>> 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'
>>>
Да, в 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, включая лямбда-функции:
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
Все предложенные решения несколько неловки.
Я нашел способ, который не является хакерским, но на самом деле соответствует оригинальному дизайну.
>>> 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'
Создает новый пустой объект Set. Если указан необязательный итеративный параметр, обновляется набор с элементами, полученными в результате итерации. Все элементы в итерируемых должны быть неизменяемыми или преобразовываться в неизменяемые с использованием протокола, описанного в разделе Протокол для автоматического преобразования в неизменяемое.
Пример:
myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)