2012-04-27 11 views
4

私は、オブジェクトが削除されたときはいつも、__del__が呼び出されたことを知りました。doesnotguaranteeすなわち 、del xは必ずしもデストラクタx.__del__()を起動しないありません。信頼性の高い方法で__del__を使用するには?

適切なオブジェクトのクリーンアップを確実にするには、context managerwithステートメント内)を使用する必要があります。

私はそれが愚かだと知っていますが、いくつか理由があります(理由は問いません)。私はPython 2.4のシステムに縛られています。したがって、コンテキストマネージャは疑問に思っていません(これらはPython 2.5で導入されました)

代わりの解決策が必要です。したがって、私の質問:__del__を確実に使用するのに役立つベストプラクティスがありますか?私は

それとも私だけだ,,,「(私はどのように把握する愚かによ)Pythonは、このような機能を提供する場合、それは効率的に使用することができる方法がなければならない」の方向に考えています素朴で、__del__を忘れて、まったく別のアプローチに移行する必要がありますか?

+3

問題はPython *がその機能を提供していますが、悲しいことに、あなたが持っているバージョンではありません。 – Joe

答えて

8

要するに、いいえ、それが確実に呼び出される方法はありません。

答えは、自分でコンテキストマネージャを実装することです。 A with声明はおおよそ次のように翻訳されます:

x.__enter__() 
try: 
    ... 
finally: 
    x.__exit__() 

それより少し複雑なので、文脈マネージャの仕組みを完全に理解するには、PEP 343を読むことをお勧めします。

クリーンアップ関数close()を呼び出して、その後のバージョンのPythonでは、簡単にcontextlib.closingを使用して実際のコンテキストマネージャにすることができます。

+0

ありがとう@Lattyware、私はこのPEPを見ていきます。 –

5

代わりの__del__、あなたのクラスcloseのようなものと呼ばれる方法を与え、その後、明示的に呼び出す:余分な安全性と将来の互換性のため

foo = Foo() 
try: 
    foo.do_interesting_stuff() 
finally: 
    foo.close() 

を、同様__exit____del__コールcloseを持っています。

+0

これはまさに私が避けたい(デストラクタ(または同等のもの)を明示的に呼び出す)ものです。残念ながら、それは唯一の方法かもしれません。ありがとう! –

関連する問題