Простые голые объекты Python
Какой самый простой способ создать голый объект, который я могу присвоить атрибутам?
Конкретный вариант использования: я выполняю различные операции с экземпляром объекта Django, но иногда экземпляр None (есть, например). В этом случае я хотел бы создать простейший возможный поддельный объект, чтобы я мог присваивать значения его атрибутам (например, myobject.foo = 'bar'
).
В основном я ищу эквивалент Python этого фрагмента Javascript:
myobject = {}
myobject.foo = 'bar'
Я знаю, что для этого могу использовать mock object/library, но я надеюсь на очень простое решение (так же просто, как и на Javascript выше). Есть ли способ создать экземпляр открытого объекта? Что-то вроде:
myobject = object()
myobject.foo = 'bar'
Ответы
Ответ 1
Сначала вам нужно создать простой класс:
class Foo(object):
pass
myobject = Foo()
myobject.foo = 'bar'
Вы можете сделать его одним слоем следующим образом:
myobject = type("Foo", (object,), {})()
myobject.foo = 'bar'
Вызов type
выполняет тождественно с предыдущим оператором class
.
Если вы хотите быть действительно минимальным...
myobject = type("", (), {})()
Ключ состоит в том, что встроенные типы (такие как list
и object
) не поддерживают определяемые пользователем атрибуты, поэтому вам нужно создать тип, используя либо оператор class
, либо вызов 3-параметрическая версия type
.
Ответ 2
Используйте модуль Bunch:
sudo pip install bunch
Связка - это словарь, который позволяет получить доступ к его контенту с помощью синтаксиса dict.key
.
А потом вот так:
from bunch import Bunch
b = Bunch()
b.foo = "Bar"
b["foo2"] = "Bar2"
print b
>> Bunch(foo='Bar', foo2='Bar2')
b["foo"] = "Baz"
print b
>> Bunch(foo='Baz', foo2='Bar2')
Ответ 3
class NakedObject(object):
pass
myobject = NakedObject()
myobject.foo = 'bar'
Ответ 4
Я прихожу сюда очень поздно, но я удивлен, что никто не упомянул namedtuples
, которые совершают такие вещи:
Foo = namedtuple('Foo', ['x'])
f = Foo(x='myattribute')
f.x
Ответ 5
Вам нужно будет сначала подклассифицировать объект таким образом...
class Myobject(object):
pass
myobject1 = Myobject()
myobject1.foo = 'bar'
Ответ 6
Возможно, вы ищете что-то вроде этого:
myobject={}
myobject['foo']='bar'
то его можно вызвать как:
print myobject['foo']
или вы можете использовать объект класса для этого:
class holder(object):
pass
то вы можете использовать что-то вроде этого:
hold=holder()
hold.myobject='bar'
print hold.myobject
Ответ 7
Вероятно, вы просто должны использовать dict, как ответ @PsychicOak.
Однако, если вам действительно нужен объект, с которым вы можете манипулировать, попробуйте:
class FooClass(object): pass
Затем вы можете назначать атрибуты непосредственно в FooClass
или в экземплярах, как вы пожелаете.
Ответ 8
Обычно я предпочитаю создать нулевой объект для моего класса:
class User(Model):
username = CharField()
password = CharField()
NONE_USER = User(username='', password='')
Затем я использую его, где я бы использовал ваш открытый объект.