__del__循環参照が関係している場合、カスタムメソッドが実行されないようです。
サンプルコードは次のとおりです。
class DelClass():
        def __init__(self,a):
            self.prop = a 
        def __del__(self):
            print 'del'
if __name__ == "__main__":
    dc1 = DelClass(None)
    dc2 = DelClass(dc1)#dc2 referring to dc1
    dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference
    del dc1#not executing the custom __del__ method
    dc = DelClass(1)
    del dc#executing the custom __del__ method
なぜこれが起こるのですか?
編集: BrenBarn に感謝します。理由がわかりました。
del somethingの参照カウントをsomething1 減らすだけです。
__del__参照カウントが 0 に達した場合にのみ実行されます。
テストコードは次のとおりです。
import gc
class DelClass():
    def __init__(self,name,a):
        self.name = name
        self.prop = a
    def __del__(self):
        print '#####deleting',self.name
dc1 = DelClass("dc1",None)
dc2 = DelClass("dc2",dc1)#dc2 referring to dc1
dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference
print "before deleting dc1,reference count:",len(gc.get_referrers(dc1))
del dc1#not executing the custom __del__ method
print "after deleting dc1, reference count:",len(gc.get_referrers(dc2.prop))
print "deleting the reference held by dc2"
del dc2.prop
print dc2
出力は次のとおりです。
before deleting dc1,reference count: 2
after deleting dc1, reference count: 1
deleting the reference held by dc2
#####deleting dc1
<__main__.DelClass instance at 0x9316dec>
#####deleting dc2
そして別の質問が表示されます:
出力の最後の行 ( #####deleting dc2) が発生するのはなぜですか?
いくつかの暗黙のdel操作が発生しますか?