Une instance de object
ne pas porter autour d'un __dict__
-- si elle l'était, avant l'horrible circulaire dépendance problème (depuis dict
, comme la plupart de tout le reste, hérite de l' object
;-), ce serait selle chaque objet en Python avec un dict, ce qui voudrait dire une surcharge de nombreux octets par l'objet qui, actuellement, n'ont pas ou ont besoin d'une dict (essentiellement, tous les objets qui n'ont pas arbitrairement assignables attributs n'ont pas ou ont besoin d'un dict).
Par exemple, à l'aide de l'excellent pympler
projet (vous pouvez l'obtenir via svn à partir d' ici), nous pouvons faire des mesures...:
>>> from pympler import asizeof
>>> asizeof.asizeof({})
144
>>> asizeof.asizeof(23)
16
Vous ne voudriez pas que chaque int
prendre 144 octets au lieu de seulement 16 ans, non?-)
Maintenant, lorsque vous effectuez une classe héritant de quoi que ce soit), les choses changent...:
>>> class dint(int): pass
...
>>> asizeof.asizeof(dint(23))
184
...l' __dict__
est maintenant ajoutée (et en plus, un peu plus de surcharge) -- une dint
instance peut avoir des attributs, mais vous devez payer assez d'un coût de l'espace pour que la flexibilité.
Donc si vous voulais int
s avec juste un attribut supplémentaire foobar
...? C'est rare de besoin, mais Python offre un mécanisme spécial pour les fins de la...
>>> class fint(int):
... __slots__ = 'foobar',
... def __init__(self, x): self.foobar=x+100
...
>>> asizeof.asizeof(fint(23))
80
...pas tout à fait aussi minuscule qu'un int
, vous l'esprit! (ou même les deux int
s, l'une de la self
le self.foobar
-- le second peut être réaffectés), mais certainement beaucoup mieux qu'un dint
.
Lorsque la classe a l' __slots__
attribut spécial (une séquence de chaînes de caractères), puis l' class
déclaration (plus précisément, la valeur par défaut métaclasse, type
) n'a pas d'équiper chaque instance de cette classe avec un __dict__
(et donc la capacité à avoir des attributs), juste un corps fini, ensemble rigide de "slots" (essentiellement les endroits qui peuvent tenir une référence à un objet) avec les prénoms.
En échange de la perte de flexibilité, vous gagnez beaucoup d'octets par exemple (probablement de sens que si vous avez des milliards de cas gallivanting autour, mais, il y sont des cas d'utilisation pour que).