次のコードがそのように動作する理由を誰かが説明できますか?
import types
class Dummy():
def __init__(self, name):
self.name = name
def __del__(self):
print "delete",self.name
d1 = Dummy("d1")
del d1
d1 = None
print "after d1"
d2 = Dummy("d2")
def func(self):
print "func called"
d2.func = types.MethodType(func, d2)
d2.func()
del d2
d2 = None
print "after d2"
d3 = Dummy("d3")
def func(self):
print "func called"
d3.func = types.MethodType(func, d3)
d3.func()
d3.func = None
del d3
d3 = None
print "after d3"
出力(d2のデストラクタは呼び出されないことに注意してください)はこれです(python 2.7)
delete d1
after d1
func called
after d2
func called
delete d3
after d3
追加されたメソッドを削除せずにデストラクタが呼び出されるようにコードを「修正」する方法はありますか?つまり、d2.func = Noneを配置するのに最適な場所は、デストラクタです。
ありがとう
[編集]最初のいくつかの回答に基づいて、私はを使用することのメリット(またはその欠如)について質問していないことを明確にしたいと思い__del__
ます。私は、直感的でない振る舞いであると私が考えるものを示す最短の関数を作成しようとしました。循環参照が作成されていると思いますが、理由はわかりません。可能であれば、循環参照を回避する方法を知りたいのですが…。