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