私は、オブジェクトの存続期間を通してアクティブな内部データベース接続を持っています。プログラムの実行の最後に、接続をコミットして閉じなければなりません。これまでは明示的にclose
メソッドを使用しましたが、これはやや面倒です。特に、呼び出しコードで例外が発生する可能性がある場合は特にそうです。オブジェクト破棄時の内部pysqlite接続のクリーンアップ
閉鎖には__del__
メソッドを使用することを検討していますが、オンラインで読んだ後に懸念があります。これは有効な使用パターンですか?内部リソースが__del__
で正しく解放されることを確認できますか?
This discussionも同様の質問がありましたが、満足のいく回答は見つかりませんでした。私は明示的なclose
メソッドを望んでおらず、with
を使うことはオプションではありません。なぜなら、私のオブジェクトは単にopen-play-closeとして使われるのではなく、別の大きなオブジェクトのメンバとして保持されているからです。 GUIで実行している間にそれを使用します。
C++には完全に安全なリソースを解放できるデストラクタがありますので、Pythonにも合意されたものがあると思います。何らかの理由でそれは事実ではないようであり、コミュニティの多くは__del__
に対して誓います。代わりに何がありますか?
このような接続を使用するオブジェクトでは、「漏れやすい抽象化」の方法では、このような仕方がないのでしょうか?なぜ私はC++のようなデストラクタを使うことができないのですか? –
@eliben:できます。しかし、デストラクタはガベージコレクタと循環参照(デストラクタが呼び出される前に循環参照を自分自身で削除する必要があります)には向いておらず、アプリケーション内の接続はグローバルモジュールが提供する単一インスタンス(シングルトン)のようです。そうでない場合(複数の接続が必要な場合)、デストラクタに行くことができます。周りの言葉を引用しないでください。 – nosklo
再C++のデストラクタ、まったくそうではありません。正しいRAIIでコーディングすると、リソースへのポインターは、カウントが保証された方法で0に達したときに割り当て解除されるスマートポインター(おそらく参照カウント)として保持されます。しかし、これには余分な機械(スマートポインタ)も必要です。 –