Notez qu'un object
L'instance n'a pas __dict__
attribut :
>>> dir(object())
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__']
Un exemple pour illustrer ce comportement dans une classe dérivée :
>>> class Foo(object):
... __slots__ = {}
...
>>> f = Foo()
>>> f.bar = 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
Citation de la documentation sur slots
:
[...] Le site __slots__
prend une séquence de variables d'instance et réserve juste assez d'espace dans chaque instance pour contenir une valeur pour chaque variable. L'espace est économisé car __dict__
n'est pas créé pour chaque instance.
EDIT : Pour répondre à ThomasH dans les commentaires, la classe d'essai du PO est une classe "à l'ancienne". Essayez :
>>> class test: pass
...
>>> getattr(test(), '__dict__')
{}
>>> getattr(object(), '__dict__')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'
et vous remarquerez qu'il y a un __dict__
instance. La classe d'objets peut ne pas avoir de __slots__
défini, mais le résultat est le même : l'absence d'une __dict__
C'est ce qui empêche l'affectation dynamique d'un attribut. J'ai réorganisé ma réponse pour rendre cela plus clair (déplacer le deuxième paragraphe vers le haut).