我正在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
图像有见是b中的__self__
引用,因为自我r对我没有意义实例方法的推断应该被忽略(就像在赋值之前那样)。
有人可以解释为什么这种行为,我该如何解决它?
好的......有一种方法可以避免这种情况?我应该缓存一些方法并在稍后恢复方法:这可能吗? – 2014-10-02 09:49:12
这取决于你想要做什么。 – Veedrac 2014-10-02 09:49:41
好的,我找到了解决方案:aa = types.MethodType(Aa,a,A) – 2014-10-02 09:54:37