Sto lavorando in Python 2.7 e mi piace il problema che mi confonde.Perché impostare un metodo associato sull'oggetto python crea un riferimento circolare?
Questo è l'esempio più semplice:
>>> class A(object):
def __del__(self):
print("DEL")
def a(self):
pass
>>> a = A()
>>> del a
DEL
che è ok come previsto ... ora sto cercando di cambiare il metodo di oggetto a
a()
e ciò che accadrà è che dopo il cambiamento che non posso eliminare a
più:
>>> a = A()
>>> a.a = a.a
>>> del a
Solo per fare alcuni controlli ho stampare il riferimento a.a
prima e dopo l'assegnazione
>>> a = A()
>>> print a.a
<bound method A.a of <__main__.A object at 0xe86110>>
>>> a.a = a.a
>>> print a.a
<bound method A.a of <__main__.A object at 0xe86110>>
Infine ho usato modulo objgraph
per cercare di capire il motivo per cui l'oggetto non viene rilasciato:
>>> b = A()
>>> import objgraph
>>> objgraph.show_backrefs([b], filename='pre-backref-graph.png')
>>> b.a = b.a
>>> objgraph.show_backrefs([b], filename='post-backref-graph.png')
Come si può vedere nell'immagine la post-backref-graph.png
lì è un riferimento a __self__
in b che non ha senso per me perché l'auto r le eferenze del metodo di istanza dovrebbero essere ignorate (come era prima del compito).
Qualcuno può spiegare perché questo comportamento e come posso aggirarlo?
Ok ... C'è un modo per evitarlo? Dovrei mettere in cache alcuni metodi e recuperare il metodo più tardi: è possibile? –
Dipende da cosa stai cercando di fare. – Veedrac
OK Ho trovato la soluzione: aa = types.MethodType (Aa, a, A) –