Как создавать объекты на лету в python?

Как создать объекты на лету в Python? Я часто хочу передать информацию в мои шаблоны Django, которые отформатированы следующим образом:

{'test': [a1, a2, b2], 'test2': 'something else', 'test3': 1}

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

class testclass():
    self.test = [a1,a2,b2]
    self.test2 = 'someting else'
    self.test3 = 1
testobj = testclass()

чтобы я мог:

{{ testobj.test }}
{{ testobj.test2 }}
{{ testobj.test3 }}

вместо вызова словаря.

Так как мне просто нужен этот объект один раз, можно ли его создать без написания класса? Есть ли короткий код? Это нормально делать это, или это плохой Python?

Ответ 1

Вы можете использовать встроенную функцию типа:

testobj = type('testclass', (object,), 
                 {'test':[a1,a2,b2], 'test2':'something else', 'test3':1})()

Но в этом конкретном случае (объект данных для шаблонов Django) вы должны использовать решение @Xion.

Ответ 2

В шаблонах Django точка-точка (testobj.test) может быть разрешена для оператора Python []. Это означает, что все, что вам нужно, это обычный dict:

testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1}

Передайте его как переменную testobj в свой шаблон, и вы можете свободно использовать {{ testobj.test }} и подобные выражения внутри вашего шаблона. Они будут переведены на testobj['test']. Здесь нет специального класса.

Ответ 3

В Python 3.3+ types.SimpleNamespace

from types import SimpleNamespace
test_obj = SimpleNamespace(a=1, b=lambda: {'hello': 42})

test_obj.a
test_obj.b()

Ответ 5

использовать тип функции здания: документ

>>> class X:
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))

первый и второй X идентичны

Ответ 6

В приведенном ниже коде также требуется создать класс, но он короче:

 >>>d = {'test':['a1','a2','b2'], 'test2':'something else', 'test3':1}
 >>> class Test(object):
 ...  def __init__(self):
 ...   self.__dict__.update(d)
 >>> a = Test()
 >>> a.test
 ['a1', 'a2', 'b2']
 >>> a.test2
 'something else'

Ответ 7

Если вы хотите объект, вы будете использовать только один раз...

class testobj(object):
    test = [a1,a2,b2]
    test2 = 'something else'
    test3 = 1

... класс тоже объект

assert testobj.test3 == 1

Это странно, класс никогда не использовался как класс. Никакие экземпляры testobj "класса" никогда не создаются. Но это простой способ создать специальный одноэлементный объект: сам класс является объектом. Его ученики легко упоминаются.