[PYTHON] Utilisez des références faibles

Lors de la création de quelque chose comme une collection de classes en Python, vous souhaiterez peut-être avoir une référence à l'objet parent.

Dans un tel cas, dans d'autres langages, on dit parfois qu'une variable appelée «propriétaire» est créée pour avoir une référence à l'objet parent, mais si elle est implémentée telle quelle, elle devient une référence circulaire, et la mémoire acquise était destinée. Il se peut qu'il ne soit pas publié au moment opportun.

Code où des références circulaires peuvent apparaître


class ParentClass:
  def __init__(self):
    self.child = []

class ChildClass:
  def __init__(self, owner):
    self._owner = owner

p = ParentClass()
p.child.append(ChildClass(p))
# ... 

Dans de tels cas, il existe une ** référence faible (module lowref) ** qui n'augmente pas le compteur de référence lors du référencement d'un objet.

Code avec des références faibles


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))
# ... 

Si vous voulez suivre la référence créée par cet objet lowref, appelez-le avec () comme une méthode.

Code avec des références faibles


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

Utilisez des références faibles
Utilisez DeepLabCut
Utiliser pycscope
Utilisez des collections.
Utilisation: Django-MySQL
Utilisez Pygments.rb
Utilisez Numpy
Utilisez pandas-ply
Django: Références
Utilisez GitPython
Utiliser Miniconda
Utilisez get autant que possible pour les références de type dictionnaire