Pracuję w Pythonie 2.7 i lubię ten problem, który mnie zastanawia.Dlaczego ustawić metodę ograniczoną do obiektu Pythona utworzyć odwołanie cykliczne?
To najprostszy przykład:
>>> class A(object):
def __del__(self):
print("DEL")
def a(self):
pass
>>> a = A()
>>> del a
DEL
To jest OK, jak oczekiwano ... teraz próbuję zmienić metodę obiektu a
a()
i co się stało jest to, że po zmianie to nie mogę usuwać a
więcej:
>>> a = A()
>>> a.a = a.a
>>> del a
Wystarczy zrobić kilka czeków mam przed i po cesji wydrukować odniesienie a.a
>>> 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>>
końcu użyłem modułu objgraph
aby spróbować zrozumieć, dlaczego obiekt nie zostanie wydany:
>>> 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')
Jak widać w post-backref-graph.png
obrazie jest odniesienie __self__
w b, które nie mają dla mnie sensu, ponieważ self r Metodę metody instance należy zignorować (tak jak przed przypisaniem).
Ktoś może wyjaśnić, dlaczego to zachowanie i jak mogę obejść go?
OK ... Czy można tego uniknąć? Powinienem buforować niektóre metody i odzyskać metodę później: czy to możliwe? –
Zależy od tego, co próbujesz zrobić. – Veedrac
OK Znalazłem rozwiązanie: aa = types.MethodType (Aa, a, A) –