Wenn Sie so etwas wie eine Sammlung von Klassen in Python erstellen, möchten Sie möglicherweise einen Verweis auf das übergeordnete Objekt haben.
In einem solchen Fall wird in anderen Sprachen manchmal gesagt, dass eine Variable namens "Eigentümer" erstellt wird, um einen Verweis auf das übergeordnete Objekt zu haben. Wenn sie jedoch so implementiert wird, wie sie ist, wird sie zu einem Zirkelverweis, und der erfasste Speicher war beabsichtigt. Es kann nicht zum Zeitpunkt freigegeben werden.
Code, in dem Zirkelverweise auftreten können
class ParentClass:
def __init__(self):
self.child = []
class ChildClass:
def __init__(self, owner):
self._owner = owner
p = ParentClass()
p.child.append(ChildClass(p))
# ...
In solchen Fällen gibt es eine ** schwache Referenz (schwaches Referenzmodul) **, die den Referenzzähler beim Referenzieren eines Objekts nicht erhöht.
Code mit schwachen Referenzen
import weakref
class ParentClass:
def __init__(self):
self.child = []
class ChildClass:
def __init__(self, owner):
self._owner = weakref.ref(owner)
p = ParentClass()
p.child.append(ChildClass(p))
# ...
Wenn Sie der von diesem schwachen Referenzobjekt erstellten Referenz folgen möchten, rufen Sie sie wie eine Methode mit () auf.
Code mit schwachen Referenzen
import weakref
class ParentClass:
def __init__(self):
self.child = []
def message(self):
print("called")
class ChildClass:
def __init__(self, owner):
self._owner = weakref.ref(owner)
def message(self):
self._owner().message()
p = ParentClass()
p.child.append(ChildClass(p))
p.child[0].message()
# ...
Recommended Posts