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,wr
die aufobj
einen Willen zeigt, der verwendet wird, um ungültig zu machen,wr
wannobj
Müll gesammelt wird?