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.
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'
>>>
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'
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!'
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
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)
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'