好奇心が強いオブジェクトで明示的に呼び出されているコードを見た__del__
ので、それがどのように機能するかを理解するために少し遊んでみました。
私は次のコードを試しました(使用__del__
すること自体が悪い可能性があることは理解していますが、ここで自分自身を教育しようとしているだけです):
class A:
def __init__(self, b):
self.a = 123
self.b = b
print "a is {}".format(self.a)
def __del__(self):
self.a = -1
print "a is {}".format(self.a)
self.b.dont_gc_me = self
def foo(self):
self.a = 9999999
print "a is {}".format(self.a)
class Foo:
def __init__(self):
self.a = 800
def __del__(self):
self.a = 0
次に、(IPythonコンソールで)次のことを試しました:
In [92]: f = Foo()
In [93]: a = A(f)
a is 123
In [94]: a = None
a is -1
In [95]: f.__dict__
Out[95]: {'a': 800, 'dont_gc_me': <__main__.A instance at 0x2456830>}
In [96]: f = None
In [97]:
インスタンス aがインスタンス f によって維持されていて__del__
も、それが一度だけ呼び出されることがわかります。後者を に設定すると、デストラクタが 2 回目に呼び出されることはありません。A
Foo
None
ここのPythonドキュメントには次のように書かれています:
__del__()
インスタンスへの新しい参照を作成することにより、メソッドがインスタンスの破棄を延期する可能性があることに注意してください (お勧めしませんが!) 。その後、この新しい参照が削除されたときに呼び出される場合があります。__del__()
インタープリターが終了したときにまだ存在しているオブジェクトに対してメソッドが呼び出されることは保証されていません。
これは、メソッドが再度呼び出される可能性があることを暗示しているようです__del__
が、そうなる保証はありません。__del__
だから私の質問は次のとおりです。再び呼び出される状況はありますか? (上記に設定f
するNone
とうまくいくと思いましたが、そうではありませんでした)。注目に値する他のニュアンスはありますか?