En Javascript sería:¿Cómo crear objetos en línea con propiedades en Python?
var newObject = { 'propertyName' : 'propertyValue' };
cómo hacerlo en Python?
En Javascript sería:¿Cómo crear objetos en línea con propiedades en Python?
var newObject = { 'propertyName' : 'propertyValue' };
cómo hacerlo en Python?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
+1 a la mejor respuesta por ahora. –
+1 - ¡Muy interesante! No estaba familiarizado con el uso de la función de tipo - ¿podría vincularme a alguna documentación sobre eso? – Smashery
http://docs.python.org/library/functions.html#type –
No sé si hay una forma integrada de hacerlo, pero siempre se puede definir una clase como esta:
class InlineClass(object):
def __init__(self, dict):
self.__dict__ = dict
obj = InlineClass({'propertyName' : 'propertyValue'})
me gusta Smashery's idea, pero Python parece contenido para que pueda modificar clases por su cuenta:
>>> class Inline(object):
... pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>
Funciona bien en Python 2.5 para mí. Tenga en cuenta que debe hacerlo a una clase derivada de object
; no funcionará si cambia la línea a obj = object
.
Sí, se puede hacer eso - pero por alguna extraña razón, usted no puede utilizar el objeto() - usted tiene que crear su propia clase. – Smashery
si quieres una clase en línea, puede usar 'obj = lambda: None', que es raro, pero se pueden realizar las tareas necesarias ... – Peter
@Peter - No sabía eso. Sin embargo, ahora que lo veo, me gusta la respuesta de SilentGhost mucho mejor. –
respuesta de Pedro
obj = lambda: None
obj.propertyName = 'propertyValue'
Increíble, ¿cómo funciona? –
@ManelClos está creando un objeto de función que no devuelve ninguno que podría verse con obj(). El objeto de función puede tener propiedades. – jeremyjjbrown
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
No es necesario definir __setattr__, ver la respuesta de Chris –
Es fácil en Python para declarar una clase con una función __init__()
que puede configurar la instancia para que, con argumentos opcionales. Si no especifica los argumentos, obtiene una instancia en blanco y si especifica algunos o todos los argumentos, inicializa la instancia.
Lo expliqué here (mi respuesta mejor calificada hasta la fecha) así que no volveré a escribir la explicación. Pero, si tiene alguna pregunta, pregunte y responderé.
Si lo que desea es un objeto genérico cuya clase en realidad no importa, usted puede hacer esto:
class Generic(object):
pass
x = Generic()
x.foo = 1
x.bar = 2
x.baz = 3
una extensión obvia sería añadir una función que imprime __str__()
algo útil.
Este truco es agradable algunas veces cuando se quiere un diccionario más conveniente. Me resulta más fácil escribir x.foo
que x["foo"]
.
Python 3.3 añade la clase SimpleNamespace
para ese propósito exacto:
>>> from types import SimpleNamespace
>>> obj = SimpleNamespace(propertyName='propertyValue')
>>> obj
namespace(propertyName='propertyValue')
>>> obj.propertyName
'propertyValue'
Además del constructor apropiado para construir el objeto, SimpleNamespace
define __repr__
y __eq__
(documented in 3.4) a comportarse como se esperaba.
¡Guau, gracias! Sabía que tenía que haber algo así en Python, y fue necesario recorrer unos 10 enlaces para encontrarlo. ¡Gracias! – dusktreader
Otra opción viable es utilizar namedtuple:
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
la misma sintaxis en Python sería crear un diccionario, y eso no es lo que quiero –
Podría explicar por qué ** ** desea lo que preguntas ¿para? Podría ayudar a la gente a guiarlo hacia alternativas mejores y más pitónicas. –
@coli Tengo un método que devuelve un objeto con algunas propiedades. En el caso de que el método falle, quiero crear este objeto manualmente. –