En JavaScript, ce serait:
var newObject = { 'propertyName' : 'propertyValue' };
Comment faire en python?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
La réponse de Peter
obj = lambda: None
obj.propertyName = 'propertyValue'
Python 3.3 ajouté le SimpleNamespace
classe pour cet objectif exact:
>>> from types import SimpleNamespace
>>> obj = SimpleNamespace(propertyName='propertyValue')
>>> obj
namespace(propertyName='propertyValue')
>>> obj.propertyName
'propertyValue'
En plus du constructeur approprié pour construire l'objet, SimpleNamespace
définit __repr__
et __eq__
( documenté dans 3.4 ) se comporter comme prévu.
Je ne sais pas s'il y a une manière intégrée de le faire, mais vous pouvez toujours définir une classe comme celle-ci:
class InlineClass(object):
def __init__(self, dict):
self.__dict__ = dict
obj = InlineClass({'propertyName' : 'propertyValue'})
J'aime Smashery's Idée, mais Python semble content de vous laisser modifier les classes par vous-même:
>>> class Inline(object):
... pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>
Fonctionne juste bien dans Python 2.5 pour moi. Notez que vous devez faire cela à une classe dérivée de object
- cela ne fonctionnera pas si vous changez la ligne à obj = object
.
Il est facile dans Python====== pour déclarer une classe avec une fonction __init__()
pouvant configurer l'instance pour vous, avec des arguments facultatifs. Si vous ne spécifiez pas les arguments Obtenez une instance vierge et si vous spécifiez tout ou partie des arguments, vous initialisez l'instance.
Je l'ai expliqué ici (ma réponse la plus classée à ce jour), je ne vais donc pas retaper l'explication. Mais si vous avez des questions, demandez et je vais répondre.
Si vous voulez juste un objet générique dont la classe n'a pas d'importance, vous pouvez le faire:
class Generic(object):
pass
x = Generic()
x.foo = 1
x.bar = 2
x.baz = 3
Une extension évidente serait d'ajouter une fonction __str__()
qui imprime quelque chose d'utile.
Cette astuce est belle parfois quand vous voulez un dictionnaire plus pratique. Je trouve plus facile de taper x.foo
Que x["foo"]
.
Une autre option viable est d'utiliser NamedTuple :
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
Silentghost a eu une bonne réponse, mais son code crée en fait un nouvel objet de type métaclass, en d'autres termes, il crée une classe. Et les classes sont des objets en python!
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
type(obj)
donne
<class 'type'>
Pour créer un nouvel objet d'une classe personnalisée ou de classe de construction avec dict attributs (propriété AKA) dans une ligne, je suggère de simplement l'appeler:
new_object = type('Foo', (object,), {'name': 'new object'})()
et maintenant
type(new_object)
est
<class '__main__.Foo'>
ce qui signifie que c'est un objet de classe foo
J'espère que cela aide ceux qui sont nouveaux à Python.