2009-10-07 8 views
33

En Javascript sería:¿Cómo crear objetos en línea con propiedades en Python?

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

cómo hacerlo en Python?

+0

la misma sintaxis en Python sería crear un diccionario, y eso no es lo que quiero –

+6

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

+0

@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. –

Respuesta

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

hay two kinds of type function uses.

+1

+1 a la mejor respuesta por ahora. –

+0

+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

+1

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

10

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'}) 
4

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.

+2

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

+5

si quieres una clase en línea, puede usar 'obj = lambda: None', que es raro, pero se pueden realizar las tareas necesarias ... – Peter

+0

@Peter - No sabía eso. Sin embargo, ahora que lo veo, me gusta la respuesta de SilentGhost mucho mejor. –

19

respuesta de Pedro

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

Increíble, ¿cómo funciona? –

+0

@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

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


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

No es necesario definir __setattr__, ver la respuesta de Chris –

2

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"].

9

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.

+1

¡Guau, gracias! Sabía que tenía que haber algo así en Python, y fue necesario recorrer unos 10 enlaces para encontrarlo. ¡Gracias! – dusktreader

0

Otra opción viable es utilizar namedtuple:

from collections import namedtuple 

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