2009-10-07 20 views
33

in Javascript sarebbe:Come creare oggetti in linea con proprietà in Python?

var newObject = { 'propertyName' : 'propertyValue' }; 

come farlo in Python?

+0

la stessa sintassi in Python creerebbe un dizionario, e che non è quello che voglio –

+6

Potrebbe spiegare il motivo per cui ** ** si desidera quello che stai chiedendo per? Potrebbe aiutare le persone a guidarti verso alternative migliori e più pitoni. –

+0

@coli Ho un metodo che restituisce un oggetto con alcune proprietà. Nel caso in cui il metodo fallisca, voglio creare questo oggetto manualmente. –

risposta

64
obj = type('obj', (object,), {'propertyName' : 'propertyValue'}) 

ci sono two kinds of type function uses.

+1

+1 per la migliore risposta di gran lunga. –

+0

+1 - Molto interessante! Non avevo familiarità con quell'uso della funzione di tipo - potresti per favore collegarmi ad una documentazione su questo? – Smashery

+1

http://docs.python.org/library/functions.html#type –

10

Non so se c'è un modo integrato di farlo, ma si può sempre definire una classe come questa:

class InlineClass(object): 
    def __init__(self, dict): 
     self.__dict__ = dict 

obj = InlineClass({'propertyName' : 'propertyValue'}) 
4

mi piace Smashery's idea, ma Python sembra contento di lasciare che si modifica lezioni da solo:

>>> class Inline(object): 
...  pass 
... 
>>> obj = Inline() 
>>> obj.test = 1 
>>> obj.test 
1 
>>> 

Funziona bene in Python 2.5 per me. Si noti che è necessario eseguire questa operazione in una classe derivata da object - non funzionerà se si modifica la linea su obj = object.

+2

Sì, puoi farlo - ma per qualche strana ragione, non puoi usare object() - devi creare la tua classe. – Smashery

+5

se si desidera una classe inline, è possibile utilizzare 'obj = lambda: None', che è bizzarro, ma eseguirà i compiti necessari ... – Peter

+0

@Peter - Non lo sapevo. Tuttavia, ora che lo vedo, mi piace molto la risposta di SilentGhost. –

19

risposta di Pietro

obj = lambda: None 
obj.propertyName = 'propertyValue' 
+1

Incredibile, come funziona? –

+0

@ManelClos sta creando un oggetto funzione che non restituisce nessuno che potreste vedere con obj(). L'oggetto funzione può avere proprietà. – jeremyjjbrown

0
class test: 
    def __setattr__(self,key,value): 
     return value 


myObj = test() 
myObj.mykey = 'abc' # set your property and value 
+0

Non è necessario definire __setattr__, vedere la risposta di Chris –

2

E 'facile in Python per dichiarare una classe con una funzione __init__() in grado di impostare l'istanza per voi, con argomenti opzionali. Se non si specificano gli argomenti si ottiene un'istanza vuota e se si specificano alcuni o tutti gli argomenti si inizializza l'istanza.

L'ho spiegato here (la mia risposta più votata alla data) quindi non ripeterò la spiegazione. Ma se hai domande, chiedi e ti risponderò.

Se si desidera solo un oggetto generico la cui classe non ha molta importanza, si può fare questo:

class Generic(object): 
    pass 

x = Generic() 
x.foo = 1 
x.bar = 2 
x.baz = 3 

Un'estensione ovvia sarebbe quella di aggiungere una funzione che consente di stampare __str__() qualcosa di utile.

Questo trucco è utile a volte quando si desidera un dizionario più conveniente. Trovo più facile digitare x.foo rispetto a x["foo"].

9

Python 3.3 ha aggiunto la classe SimpleNamespace a tale scopo esatto:

>>> from types import SimpleNamespace 

>>> obj = SimpleNamespace(propertyName='propertyValue') 
>>> obj 
namespace(propertyName='propertyValue') 

>>> obj.propertyName 
'propertyValue' 

Oltre al costruttore appropriato per costruire l'oggetto, SimpleNamespace definisce __repr__ e __eq__ (documented in 3.4) a comportarsi come previsto.

+1

Wow, grazie! Sapevo che doveva esserci qualcosa di simile in Python, e ci sono voluti circa 10 link per trovare questo. Grazie! – dusktreader

0

Un'altra soluzione possibile è quella di utilizzare namedtuple:

from collections import namedtuple 

message = namedtuple('Message', ['propertyName'], verbose=True) 
messages = [ 
    message('propertyValueOne'), 
    message('propertyValueTwo') 
] 
Problemi correlati