Die __weakref__Variable ist ein Attribut, mit dem das Objekt die schwachen Referenzen unterstützt und die schwachen Referenzen auf das Objekt beibehält.
In der Python-Dokumentation wurde dies wie folgt erklärt:
Wenn die einzigen verbleibenden Verweise auf einen Verweis schwache Verweise sind, kann die Garbage Collection den Verweis zerstören und seinen Speicher für etwas anderes wiederverwenden.
Daher besteht die Pflicht schwacher Referenzen darin, die Bedingungen für ein Objekt bereitzustellen, damit unabhängig von seiner Art und seinem Umfang Müll gesammelt werden kann.
Und darüber __slots__können wir uns zunächst die Dokumentation ansehen, die es sehr gut erklärt:
Standardmäßig verfügen Instanzen von Klassen über ein Wörterbuch für die Attributspeicherung. Dies verschwendet Platz für Objekte mit sehr wenigen Instanzvariablen. Der Platzverbrauch kann akut werden, wenn eine große Anzahl von Instanzen erstellt wird.
Die Standardeinstellung kann durch Definieren __slots__in einer Klassendefinition überschrieben werden . Die __slots__Deklaration verwendet eine Folge von Instanzvariablen und reserviert in jeder Instanz gerade genug Speicherplatz, um einen Wert für jede Variable zu speichern. Speicherplatz wird gespart, da __dict__nicht für jede Instanz erstellt wird.
Da __slots__Sie nun mithilfe von den erforderlichen Speicher für Ihr Attribut steuern, wird die automatische Erstellung von __dict__und __weakref__für jede Instanz tatsächlich verhindert . Welches __weakref__ist die notwendige Variable jedes Objekts, um mit schwachen Referenzen umgehen zu können.
Zusätzlich zu all diesen Angaben heißt es in der Dokumentation für den object.__slots__Unterricht:
Dieser Klassenvariablen kann eine Zeichenfolge, eine Iterable oder eine Folge von Zeichenfolgen mit Variablennamen zugewiesen werden, die von Instanzen verwendet werden. __slots__reserviert Platz für die deklarierten Variablen und verhindert die automatische Erstellung von __dict__und __weakref__für jede Instanz.
Kurz gesagt, wir können daraus schließen, dass __slots__für die manuelle Verwaltung der Speicherzuordnung und da __weakref__die Lizenz zum Akzeptieren der schwachen Referenzen für Objekte, die sich auf die Speicherung beziehen (aufgrund der Fähigkeit, Müll zu sammeln), __slots__die __weakref__as gesteuert wird sowie die Steuerung des __dict__Attributs.
Die Dokumentation hat Ihnen auch gezeigt, wie Sie ein Objekt erstellen können, um die schwachen Referenzen neben der Verwendung zu unterstützen __slots__:
Ohne eine __weakref__Variable für jede Instanz unterstützen definierende Klassen __slots__keine schwachen Verweise auf ihre Instanzen. Wenn eine schwache Referenzunterstützung benötigt wird, fügen Sie '__weakref__'die Zeichenfolge in der __slots__Deklaration hinzu.
Hier ist ein Beispiel in 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>
In Python 2.7 wird jedoch, obwohl die Dokumentation den oben genannten Dokumenten ähnelt, das Erstellen einer schwachen Referenz aus Instanzen, die die __weakref__Variable in ihren __slots__Namen nicht enthalten, nicht ausgelöst TypeError:
>>> class Test:
... __slots__ = ['a', 'b']
...
>>> t = Test()
>>>
>>> r = weakref.ref(t)
>>>
>>> r
<weakref at 0x7fe49f4185d0; to 'instance' at 0x7fe4a3e75f80>
obj.__weakref__erinnert sich also an die schwache Referenz,wrdie aufobjeinen Willen zeigt, der verwendet wird, um ungültig zu machen,wrwannobjMüll gesammelt wird?