in Javascript sarebbe:Come creare oggetti in linea con proprietà in Python?
var newObject = { 'propertyName' : 'propertyValue' };
come farlo in Python?
in Javascript sarebbe:Come creare oggetti in linea con proprietà in Python?
var newObject = { 'propertyName' : 'propertyValue' };
come farlo in Python?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
ci sono two kinds of type
function uses.
+1 per la migliore risposta di gran lunga. –
+1 - Molto interessante! Non avevo familiarità con quell'uso della funzione di tipo - potresti per favore collegarmi ad una documentazione su questo? – Smashery
http://docs.python.org/library/functions.html#type –
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'})
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
.
Sì, puoi farlo - ma per qualche strana ragione, non puoi usare object() - devi creare la tua classe. – Smashery
se si desidera una classe inline, è possibile utilizzare 'obj = lambda: None', che è bizzarro, ma eseguirà i compiti necessari ... – Peter
@Peter - Non lo sapevo. Tuttavia, ora che lo vedo, mi piace molto la risposta di SilentGhost. –
risposta di Pietro
obj = lambda: None
obj.propertyName = 'propertyValue'
Incredibile, come funziona? –
@ManelClos sta creando un oggetto funzione che non restituisce nessuno che potreste vedere con obj(). L'oggetto funzione può avere proprietà. – jeremyjjbrown
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
Non è necessario definire __setattr__, vedere la risposta di Chris –
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"]
.
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.
Wow, grazie! Sapevo che doveva esserci qualcosa di simile in Python, e ci sono voluti circa 10 link per trovare questo. Grazie! – dusktreader
Un'altra soluzione possibile è quella di utilizzare namedtuple:
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
la stessa sintassi in Python creerebbe un dizionario, e che non è quello che voglio –
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. –
@coli Ho un metodo che restituisce un oggetto con alcune proprietà. Nel caso in cui il metodo fallisca, voglio creare questo oggetto manualmente. –