必要なファイル処理機能をラップするクラスがあります。別のクラスはfilehandler
のインスタンスを作成し、それを不定期に使用します。結局、caller
が破壊され、filehandler
への唯一の参照が破棄されます。ファイルのクラスラッパー - 参照されなくなったときにファイルハンドルを閉じる適切な方法
filehandler
にファイルを閉じる最も良い方法は何ですか?
私は現在__del__(self)
を使用しますが、severaldifferentquestionsand articlesを見た後、私は、これは悪いことでは考えられている印象の下です。
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()
これはハンドラの関連ビットです。クラスの全体のポイントは、基礎となるファイルオブジェクトの操作の詳細を抽象化し、ファイル全体を不必要にメモリに読み込まないようにすることです。しかし、オブジェクトがスコープから外れたときに、基礎となるファイルを処理することの一部がクローズされます。
caller
は、filehandler
に記載されている内容を知っていたり、気にすることはありません。範囲外になったときに必要なリソースを解放するのはfilehandler
の仕事です。それが最初に抽象化された理由の1つです。だから、filehandler
コードを呼び出しオブジェクトに移動したり、漏れ抽象を扱うことに直面しているようです。
思考?
ニーストリック '__enterの__()'でファイルを開くと - あなたはまた、ファイルの位置を保持するために、そこにいくつかの魔法を行うことができます開閉間。 – kindall
非常にいいです、これは私が望んでいたものに非常に近いです。 refサイクルは私がチェックした最初のもので、私は何も持っていません。しかし、いくつかの記事では、refサイクルにかかわらず、リーフオブジェクトにdelメソッドがある場合、オブジェクトチェーン全体が非回収可能であると言われています。 –
@SpencerRathbun:私が見つけられたすべての文書は、アイテムが回収不能であることを示しています** ** refサイクルがある場合のみです。 –