[解決済み] Pythonのオブジェクトを正しくクリーンアップするにはどうしたらいいですか?
質問
class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
__del__(self)
上記はAttributeError例外で失敗します。 私は理解しています
Pythonは
が存在する場合、グローバル変数(この文脈ではメンバデータ?
__del__()
が呼び出されます。 もしそうなら、そしてこれが例外の理由なら、どうすればオブジェクトが適切に破壊されることを確認できるでしょうか?
解決方法は?
Pythonの
with
文は、クリーンアップが必要なリソースを管理するために使用します。 明示的な
close()
ステートメントを呼び出すことを忘れてしまったり、それを
finally
ブロックを作成し、例外発生時のリソースリークを防いでいます。
を使用するには
with
文の中で、以下のメソッドを持つクラスを作成します。
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
上記の例では
class Package:
def __init__(self):
self.files = []
def __enter__(self):
return self
# ...
def __exit__(self, exc_type, exc_value, traceback):
for file in self.files:
os.unlink(file)
そして、誰かがあなたのクラスを使いたいと思ったとき、次のようにします。
with Package() as package_obj:
# use package_obj
変数 package_obj は Package 型のインスタンスになります (これは
__enter__
メソッド)。 その
__exit__
メソッドは、例外の発生有無にかかわらず、自動的に呼び出されます。
このアプローチをさらに一歩進めることもできます。 上記の例では,誰かがパッケージのインスタンスを作成する際に
with
節があります。 そんなことは起こって欲しくないですよね。 PackageResourceクラスを作成し、そのクラスで
__enter__
と
__exit__
メソッドを使用します。 そうすると、Packageクラスは厳密には
__enter__
メソッドで返されます。 そうすれば呼び出し側は
with
ステートメントを使用します。
class PackageResource:
def __enter__(self):
class Package:
...
self.package_obj = Package()
return self.package_obj
def __exit__(self, exc_type, exc_value, traceback):
self.package_obj.cleanup()
これを次のように使うのです。
with PackageResource() as package_obj:
# use package_obj
関連
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python Decorator 練習問題
-
Python カメの描画コマンドとその例
-
Python 入出力と高次代入の基礎知識
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み] PythonからC/C++を呼び出す?[クローズド]
-
[解決済み] RubyからPythonを学ぶ:違いと共通点