2011-12-20 21 views
11

¿Cómo creo objetos sobre la marcha en Python? A menudo me quiero pasar información a mis plantillas de Django que está formateado como esto:¿Cómo crear objetos sobre la marcha en python?

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

lo que hace que la plantilla verá desordenado. por lo que creo que es preferible crear un objeto que es como:

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

por lo que se puede hacer:

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

lugar de llamar al diccionario.

Como solo necesito ese objeto una vez, ¿es posible crearlo sin escribir primero una clase? ¿Hay algún código de mano corta? ¿Está bien hacerlo así o es malo Python?

+5

Bueno, primero debes hacer que la mosca se detenga. Entonces necesitas crear algunos objetos MUY PEQUEÑOS ... (Lo siento, no pude resistir) –

Respuesta

22

puede utilizar construido en type function:

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

Pero en este caso específico (objeto de datos de plantillas de Django), se debe utilizar @ solución de Xion.

+5

Por favor, no hagas esto. Simple es mejor que complejo. –

+1

@ number5 ¡Votaré por su respuesta si también sugiere no usar este código! (al menos no para este caso específico) –

+0

+1 Esto responde la pregunta que le hice a Google. – MrOodles

19

En las plantillas de Django, la notación de puntos (testobj.test) se puede resolver con el operador de Python []. Esto significa que todo lo que necesita es un dict ordinaria:

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

pasarlo como testobj variable para su plantilla y se puede utilizar libremente {{ testobj.test }} y expresiones similares dentro de su plantilla. Se traducirán al testobj['test']. No se necesita una clase dedicada aquí.

+0

gracias, eso resolvió la parte relacionada con django de mi problema :) simplemente comprobé la otra respuesta porque la gente que viene de google probablemente preferiría ver la respuesta relacionada con Python. – JasonTS

+1

@JasonTS, la respuesta relacionada con Python sería usar la respuesta de Karl Knechtel de 'collections.namedtuple'. – Duncan

0

El código siguiente también requieren una clase que se cree sin embargo, es más corto:

>>>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' 
5

Hay otra solución en Python 3.3+types.SimpleNamespace

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

test_obj.a 
test_obj.b() 
0

uso de tipo de función edificio: document

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

primera y segunda X son identi cal

Cuestiones relacionadas