2011-12-20 15 views
11

Come posso creare oggetti al volo in Python? Spesso mi voglio passare le informazioni ai miei modelli di Django che è formattato in questo modo:Come creare oggetti al volo in python?

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

che rende il modello aspetto disordinato. quindi penso che sia meglio per creare solo un oggetto che è come:

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

così posso fare:

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

invece di chiamare il dizionario.

Poiché ho appena bisogno di quell'oggetto una volta, è possibile crearlo senza scrivere prima una classe? C'è qualche codice a mano breve? Va bene farlo in questo modo o è pessimo Python?

+5

Beh, per prima cosa devi prendere il volo per fermarti. Quindi è necessario creare alcuni oggetti MOLTO PICCOLI ... (Scusate, non ho potuto resistere.) –

risposta

22

È possibile utilizzare built-in type function:

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

Ma in questo caso specifico (oggetto di dati per i modelli di Django), è necessario utilizzare @ soluzione di Xion.

+5

Si prega di non farlo. Semplice è meglio che complesso. –

+1

@ number5 Voterò per la tua risposta se suggerisci anche di non usare questo codice! (almeno non per questo caso specifico) –

+0

+1 Questo risponde alla domanda che ho chiesto a Google. – MrOodles

19

Nei modelli Django, la notazione a punti (testobj.test) può essere risolta con l'operatore [] di Python. Questo significa che tutto ciò che serve è un dict ordinaria:

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

passarla come testobj variabile per il modello e si può utilizzare liberamente {{ testobj.test }} e espressioni simili all'interno del vostro modello. Verranno tradotti in testobj['test']. Nessuna classe dedicata è necessaria qui.

+0

grazie, che ha risolto la parte relativa al django del mio problema :) ho appena controllato l'altra risposta perché la gente che viene da google probabilmente preferirebbe vedere la risposta relativa a Python. – JasonTS

+1

@JasonTS, la risposta relativa a Python sarebbe quella di usare la risposta di Karl Knechtel di 'collections.namedtuple'. – Duncan

0

Il codice sotto richiedono anche una classe da creare tuttavia è più corta:

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

C'è un'altra soluzione in 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 tipo di funzione edificio: document

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

primo e secondo X sono identi cal