CPython を含む他のすべての Python 実装で行う必要があるのと同じ方法: 自動メモリ管理と.__del__
__del__
CPython でさえ、がまったく呼び出されないケースが 1 つ以上あり、予想よりもかなり遅れて呼び出されるケースがかなりあります (たとえば、任意のオブジェクトが参照サイクルに巻き込まれた場合、これは非常に簡単に発生する可能性があります)。 )。つまり、おそらく有効期間の問題をデバッグする場合 (ただし、そのためのメモリ プロファイラがあります!) と、一部のコードが明示的にクリーンアップを怠った場合の最後の手段を除いて、本質的に役に立たないことを意味します。
クリーンアップについて明確にすることで、これらすべての問題を回避できます。クリーンアップを行うメソッドを用意し、クライアント コードが適切なタイミングでそれを呼び出せるようにします。コンテキスト マネージャーを使用すると、例外が発生した場合にこれを正しく処理しやすくなり、読みやすくなります。多くの場合、参照カウントが「すぐに」 を呼び出す場合__del__
でも、よりも早くクリーンアップできます。たとえば、次のようになります。__del__
def parse_file(path):
f = open(path)
return parse(f.read()) # file stays open during parsing
この wrt リソース使用量よりも悪い:
def parse_file(path):
with open(path) as f:
s = f.read()
# file is closed here
return parse(s)
また、リソース ラッパー オブジェクトの有効期間とラップされたリソースの有効期間を混同しないため、このような設計はよりクリーンであると主張します。場合によっては、そのオブジェクトをリソースよりも長く存続させたり、新しいリソースの所有権を取得したりすることが理にかなっている場合があります。