web-dev-qa-db-fra.com

Comment créer des objets en ligne avec des propriétés à Python?

En JavaScript, ce serait:

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

Comment faire en python?

46
Jader Dias
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})

il y a deux types d'utilisations de fonction type .

82
SilentGhost

La réponse de Peter

obj = lambda: None
obj.propertyName = 'propertyValue'
27
Jader Dias

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.

21
Sylvain Leroux

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'})
13
Smashery

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.

6
Chris Lutz

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

2
steveha

Une autre option viable est d'utiliser NamedTuple :

from collections import namedtuple

message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
    message('propertyValueOne'),
    message('propertyValueTwo')
]
1
b.b3rn4rd
class test:
    def __setattr__(self,key,value):
        return value


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

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.

0
Leo Skhrnkv