L' __weakref__
variable est un attribut qui fait l'objet de soutenir les références faibles et la préservation de la faiblesse des références à l'objet.
La documentation python a expliqué de la manière suivante:
quand il ne reste références à un référent sont des références faibles, la collecte des ordures est libre de détruire le référent et la réutilisation de la mémoire de quelque chose d'autre.
Par conséquent, le devoir de la faiblesse des références est de fournir les conditions d'un objet afin d'être en mesure d'être des ordures collectées indépendamment de son type et de l'étendue.
Et à propos de l' __slots__
, on peut d'abord regarder dans la documentation qui l'explique très bien:
Par défaut, les instances de classes ont un dictionnaire pour le stockage des attributs. Cela gaspille de l'espace pour les objets ayant très peu de variables d'instance. La consommation de l'espace peut devenir aiguë lors de la création d'un grand nombre de cas.
La valeur par défaut peut être remplacée par la définition d' __slots__
dans une définition de classe. L' __slots__
déclaration prend une séquence de variables d'instance et les réserves de juste assez d'espace dans chaque cas pour contenir une valeur pour chaque variable. L'espace est sauvé parce qu' __dict__
n'est pas créé pour chaque instance.
Maintenant, puisque, en utilisant __slots__
vous aurez le contrôle de l'demandé de stockage et d'un attribut, il empêche la création automatique d' __dict__
et __weakref__
pour chaque instance. Qui l' __weakref__
est la variable de chaque objet afin d'être en mesure de traiter avec les références faibles.
Aussi, en plus de tous ces la documentation pour object.__slots__
de la classe dit:
Cette variable de classe peut être affecté à une chaîne, itératif, ou d'une séquence de chaînes de caractères avec des noms de variables utilisés par les instances. __slots__
réserve de l'espace pour les variables déclarées et empêche la création automatique d' __dict__
et __weakref__
pour chaque instance.
Donc, En résumé, nous pouvons conclure que __slots__
sont de la gestion de l'allocation de stockage manuellement et depuis __weakref__
est la licence de l'acceptation de la faiblesse des références pour les objets qui sont liés au stockage (en raison de la capacité de déchets de la collecte), par conséquent __slots__
contrôle l' __weakref__
ainsi que le contrôle de l' __dict__
attribut.
La documentation vous a montré la voie de la réalisation d'un objet à l'appui de la faiblesse de références tout au long de l'aide d' __slots__
:
Sans un __weakref__
variable pour chaque exemple, les classes définissant __slots__
ne prennent pas en charge la faiblesse des références à ses instances. Si la faiblesse de support de référence est nécessaire, puis ajouter '__weakref__'
à la séquence de chaînes dans l' __slots__
déclaration.
Voici un exemple en python 3.X:
>>> class Test:
... __slots__ = ['a', 'b']
...
>>>
>>> import weakref
>>>
>>> t = Test()
>>>
>>> r = weakref.ref(t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create weak reference to 'Test' object
>>>
>>> class Test:
... __slots__ = ['a', 'b', '__weakref__']
...
>>> t = Test()
>>> r = weakref.ref(t)
>>>
>>> t.__weakref__
<weakref at 0x7f735bc55d68; to 'Test' at 0x7f735bc51fc8>
Mais en python 2.7, bien que la documentation est comme susmentionnés, de docs, de la création d'une référence faible à partir d'instances qui ne fournit pas l' __weakref__
variable dans leur __slots__
noms ne soulève pas un TypeError
:
>>> class Test:
... __slots__ = ['a', 'b']
...
>>> t = Test()
>>>
>>> r = weakref.ref(t)
>>>
>>> r
<weakref at 0x7fe49f4185d0; to 'instance' at 0x7fe4a3e75f80>