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

Простые голые объекты Python

Какой самый простой способ создать голый объект, который я могу присвоить атрибутам?

Конкретный вариант использования: я выполняю различные операции с экземпляром объекта Django, но иногда экземпляр None (есть, например). В этом случае я хотел бы создать простейший возможный поддельный объект, чтобы я мог присваивать значения его атрибутам (например, myobject.foo = 'bar').

В основном я ищу эквивалент Python этого фрагмента Javascript:

myobject = {}
myobject.foo = 'bar'

Я знаю, что для этого могу использовать mock object/library, но я надеюсь на очень простое решение (так же просто, как и на Javascript выше). Есть ли способ создать экземпляр открытого объекта? Что-то вроде:

myobject = object()
myobject.foo = 'bar'
4b9b3361

Ответ 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='')

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