Я работаю в Python 2.7, и мне нравится эта проблема, которая меня озадачивает.Зачем устанавливать связанный метод для объекта python, создать круговую ссылку?
Это самый простой пример:
>>> class A(object):
def __del__(self):
print("DEL")
def a(self):
pass
>>> a = A()
>>> del a
DEL
Это нормально, как ожидалось ... Теперь я пытаюсь изменить a()
метод объекта a
и что произойдет в том, что после изменения его я не могу удалить a
больше:
>>> a = A()
>>> a.a = a.a
>>> del a
Просто сделать некоторые проверки Я напечатать 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>>
Наконец я использовал objgraph
модуль, чтобы попытаться понять, почему объект не выделяется:
>>> 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')
Как вы можете видеть в post-backref-graph.png
изображение там это __self__
ссылки в b, которые не имеют для меня никакого смысла, потому что self r ebooks метода instance следует игнорировать (как было до назначения).
Кто-нибудь может объяснить, почему это поведение и как я могу его обойти?
Хорошо ... Есть ли способ избежать этого? Я должен кэшировать некоторые методы и позже восстановить метод: возможно ли это? –
Это зависит от того, что вы пытаетесь сделать. – Veedrac
OK Я нашел решение: aa = types.MethodType (Aa, a, A) –