web-dev-qa-db-fra.com

Créer un objet vide en Python

Existe-t-il des raccourcis pour définir un objet vide dans Python ou devez-vous toujours créer une instance d'une classe vide personnalisée?

Edit: Je veux dire un objet vide utilisable pour la frappe de canard.

55
Smiles

Vous pouvez utiliser type pour créer une nouvelle classe à la volée puis l'instancier. Ainsi:

>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>

Les arguments à saisir sont les suivants: nom de classe, un tuple de classes de base et le dictionnaire de l'objet. Qui peut contenir des fonctions (les méthodes de l'objet) ou des attributs.

Vous pouvez réellement raccourcir la première ligne pour 

>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)

Parce que par défaut, type crée de nouvelles classes de style héritées de object. 

type est utilisé en Python pour métaprogrammation

Mais si vous voulez juste créer une instance d'objet. Ensuite, créez simplement une instance de celui-ci. Comme le suggère lejlot. 

La création d'une instance d'une nouvelle classe comme celle-ci présente une différence importante qui peut être utile. 

>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'

Tandis que:

>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>> 
68
aychedee

Oui, en Python 3.3 SimpleNamespace a été ajouté

Contrairement à objet, avec SimpleNamespace, vous pouvez ajouter et supprimer des attributs. Si un objet SimpleNamespace est initialisé avec des arguments de mot clé, ceux-ci sont directement ajoutés à l'espace de nom sous-jacent.

Exemple:

import types

x = types.SimpleNamespace()
x.happy = True

print(x.happy) # True

del x.happy
print(x.happy) # AttributeError. object has no attribute 'happy'
37
Vlad Bezden

Un moyen simple et moins terrifiant de créer un objet vide (-ish) consiste à exploiter le fait que les fonctions sont des objets en Python, y compris les fonctions Lambda:

obj = lambda: None
obj.test = "Hello, world!"

Par exemple:

In [18]: x = lambda: None

In [19]: x.test = "Hello, world!"

In [20]: x.test
Out[20]: 'Hello, world!'
34
Will

Qu'entendez-vous par "objet vide"? Instance de classe object? Vous pouvez simplement courir

a = object()

ou peut-être que vous voulez dire initialisation à la référence nulle? Ensuite, vous pouvez utiliser 

a = None
11
lejlot

Construit un nouvel objet Set empty . Si le paramètre optionnel iterable est fourni, le jeu est mis à jour avec les éléments obtenus à partir de l'itération. Tous les éléments dans iterable doivent être immuables ou pouvoir être transformés en immuable en utilisant le protocole décrit dans la section Protocole pour la conversion automatique en immuable.

Ex:

myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)
0
D z

Toutes les solutions proposées sont un peu gênantes.

J'ai trouvé un moyen qui n'est pas hacky mais qui correspond au design original.

>>> from mock import Mock
>>> foo = Mock(spec=['foo'], foo='foo')
>>> foo.foo
'foo'
>>> foo.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/prezi/virtualenv/local/lib/python2.7/site-packages/mock/mock.py", line 698, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'bar'

Voir la documentation de unittest.mock ici.

0
qben