6

オブジェクトが削除されるたびに が呼び出されることを Python が保証して ない ことを知りました。つまり、必ずしもデストラクタを呼び出すとは限りません__del__del x x.__del__()

適切なオブジェクトのクリーンアップを確実にしたい場合は、(ステートメントで)コンテキスト マネージャーを使用する必要があります。with

ばかげていることはわかっていますが、いくつかの理由で (理由は聞かないでください)、私は Python 2.4 のシステムに縛られています。したがって、コンテキストマネージャーは問題外です (Python 2.5 で導入されました)。

したがって、代替ソリューションが必要なので、私の質問:__del__確実に使用するのに役立つベストプラクティスはありますか? 「pythonにそんな機能があるなら、効率的に使える方法があればいいのに(どうしようか考え中です)」という方向で考えているのですが、、、

それとも、私は単純なので、忘れ__del__て、まったく別のアプローチに移るべきですか?

4

2 に答える 2

8

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

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

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

したがって、手動で行うだけです。それよりも少し複雑なので、コンテキストマネージャーがどのように機能するかを完全に理解するには、 PEP 343を読むことをお勧めします。

1 つのオプションは、クリーンアップ関数を呼び出すことです。そうすれば、Python の将来のバージョンでは、人々はそれを実際のコンテキスト マネージャーに変えるためにclose()簡単に使用できます。contextlib.closing

于 2012-04-27T14:27:52.870 に答える
5

の代わりに__del__、クラスに のようなメソッドcloseを指定し、それを明示的に呼び出します。

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

追加の安全性と前方互換性のために、have__exit____del__callcloseも使用してください。

于 2012-04-27T14:31:20.270 に答える