我正在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