[PYTHON] Verwenden Sie schwache Referenzen

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

Verwenden Sie schwache Referenzen
Verwenden Sie DeepLabCut
Verwenden Sie pycscope
Verwenden Sie Sammlungen
Verwenden Sie: Django-MySQL
Verwenden Sie Pylements.rb
Verwenden Sie Numpy
Verwenden Sie Pandas-Ply
Django: Referenzen
Verwenden Sie GitPython
Verwenden Sie Miniconda
Verwenden Sie get so viel wie möglich für Referenzen vom Typ Wörterbuch