Если вы воспользуетесь подходом метаклассирования из ответа @Martijn, ответ @Ned можно переписать короче (хотя он, очевидно, менее читабелен, но делает то же самое).
obj = type('Expando', (object,), {})()
obj.foo = 71
obj.bar = 'World'
Или просто, что делает то же самое, что и выше, с использованием аргумента dict
:
obj = type('Expando', (object,), {'foo': 71, 'bar': 'World'})()
Для Python 3 передача объекта в аргумент bases
необязательна (см. type
документация).
Но для простых случаев инстанцирование не приносит никакой пользы, так что можно поступить следующим образом:
ns = type('Expando', (object,), {'foo': 71, 'bar': 'World'})
В то же время лично я предпочитаю простой класс (то есть без создания экземпляров) для случаев специальной тестовой конфигурации как наиболее простой и читаемый:
class ns:
foo = 71
bar = 'World'
Обновлять
В Python 3.3+ существует именно то, что запрашивает OP, types.SimpleNamespace
. Это просто:
Простой подкласс object
, который обеспечивает доступ по атрибутам к своему пространству имен, а также к содержательному представлению.
В отличие от object
, с SimpleNamespace
вы можете добавлять и удалять атрибуты. Если объект SimpleNamespace
инициализируется аргументами ключевого слова, они напрямую добавляются в базовое пространство имен.
import types
obj = types.SimpleNamespace()
obj.a = 123
print(obj.a) # 123
print(repr(obj)) # namespace(a=123)
Однако в stdlib как Python 2, так и Python 3 есть argparse.Namespace
, который имеет ту же цель:
Простой объект для хранения атрибутов.
Реализует равенство по именам и значениям атрибутов и предоставляет простое строковое представление.
import argparse
obj = argparse.Namespace()
obj.a = 123
print(obj.a) # 123
print(repr(obj)) # Namespace(a=123)
Обратите внимание, что оба могут быть инициализированы с помощью аргументов ключевого слова:
types.SimpleNamespace(a = 'foo',b = 123)
argparse.Namespace(a = 'foo',b = 123)
person
saaj
schedule
10.04.2017
setattr(dynamic_object, variable_with_property_name, variable_with_property_value)
? вам нужна коллекция, чтобы связать некоторые «свойства» со значениями, и тип этой вещи используется в одном месте ... не могли бы вы действительно захотетьdict
? - person SingleNegationElimination   schedule 24.12.2012