Pythonでは、オブジェクトがファイナライズされた後に関数を呼び出す方法はありますか?Pythonのweakrefコールバックと__del__の実行順序
weakrefのコールバックはそれを行うと思っていましたが、weakrefのコールバックは、オブジェクトがガベージコレクションされた後、オブジェクト__del__
メソッドが呼び出される前に呼び出されます。これはthe notes on weakrefs and garbage collection in the Python trunkに反しているようです。ここに例があります。
import sys
import weakref
class Spam(object) :
def __init__(self, name) :
self.name = name
def __del__(self) :
sys.stdout.write("Deleting Spam:%s\n" % self.name)
sys.stdout.flush()
def cleaner(reference) :
sys.stdout.write("In callback with reference %s\n" % reference)
sys.stdout.flush()
spam = Spam("first")
wk_spam = weakref.ref(spam, cleaner)
del spam
私が手出力は
$ python weakref_test.py
In callback with reference <weakref at 0xc760a8; dead>
Deleting Spam:first
私がやりたいためにいくつかの他の従来の方法はありますか?私は何とか私のコールバックでファイナライズを強制することはできますか?
、私はすべてのデータセットが使用されなくなったときに、ファイルが自動的に閉じないPyTablesアクセスをラップしようとしている、と私は、「残りの開いているファイルを閉じる...」メッセージを回避。 (これは何百ものファイルの読み込みを抽象化するためのライブラリコードです) – AFoglia