オブジェクトの削除が Python でどのように機能するかを理解したいと思います。これは非常に単純なコードの集まりです。
class A(object):
def __init__(self):
setattr(self, "test", self._test)
def _test(self):
print "Hello, World!"
def __del__(self):
print "I'm dying!"
class B(object):
def test(self):
print "Hello, World!"
def __del__(self):
print "I'm dying"
print "----------Test on A"
A().test()
print "----------Test on B"
B().test()
Pythonista は、Python 2.x バージョンを実行していることを認識します。さらに具体的には、このコードは python 2.7.1 セットアップで実行されます。
このコードは次を出力します。
----------Test on A
Hello, World!
----------Test on B
Hello, World!
I'm dying
驚いたことに、A
オブジェクトは削除されません。setattr
のステートメントは__init__
循環参照を生成するため、その理由は理解できます。しかし、これは簡単に解決できそうです。
最後に、Python ドキュメント (Supporting Cyclic Garbage Collection)のこのページは、この種の循環参照を処理できることを示しています。
私が知りたいのですが:
- クラス
__del__
でメソッドを実行しないのはなぜですか?A
- 循環参照に関する私の診断が正しい場合、
object
サブクラスが循環ガベージ コレクションをサポートしていないのはなぜですか? - 最後に、本当に行きたい
setattr
場合、この種の対処方法は?__del__
注:がモジュールの別のメソッドを指しているA
場合、問題はありません。setattr