Python では、__del__ メソッドを使用してオブジェクトをクリーンアップできます。ただし、このメソッドは実行中にグローバル変数の存在に依存するため、制限があります。
次の例を考えてみましょう:
class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file)
この __del__ メソッドはファイルを削除することを目的としています。ファイルリストに割り当てられます。ただし、__del__ の呼び出し時にグローバル変数 (この場合は self.files) が存在しない可能性があるため、AttributeError 例外で失敗する可能性があります。
オブジェクトを確実にクリーンアップするには、Python では with ステートメントを使用することをお勧めします。 with ステートメントは、リソースの割り当てとクリーンアップを自動的に処理できるコンテキスト マネージャーを提供します。
with ステートメントを使用してクリーンアップを実装する方法は次のとおりです。
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)
この例では、__enter__ メソッドは次の値を返します。 Package クラスのインスタンス。with ステートメントで使用すると変数 (package_obj など) に割り当てられます。 __exit__ メソッドは、例外が発生したかどうかに関係なく、with ブロックの後に呼び出されます。
さらに、ターゲット クラスをラップし、__enter__ メソッドと __exit__ メソッドを提供するリソース管理クラスを作成することで、このアプローチを強化できます。これにより、ターゲット クラスは 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
この手法により、例外が発生したり、ターゲットクラスは with ステートメントを使用せずにインスタンス化されます。
以上がPython オブジェクトでリソースを確実にクリーンアップする方法: __del__ と `with` ステートメント?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。