多数の子オブジェクトをインスタンス化するスクリプトがあります。スクリプト (およびこれらのオブジェクト) が終了すると、オブジェクトは少しクリーンアップする必要があります (特に一時ファイルのクローズと削除)。
私はどのよう__del__
に信頼できないかを読み続けていますが、コンテキスト管理は機能していないようで、子オブジェクトは持続しません。彼らはぶらぶらする必要があります(ファイルの読み取りや書き込みなどを行うため)
例:
ライター.PY
import os
class Writer(object):
def __init__(self, filename):
self.filename = filename
self.open()
def open(self):
self.fh = open(self.filename, "w+", 0)
def write(self, msg):
print >>self.fh, str(msg)
def close(self):
self.fh.close()
os.remove(self.filename)
def __enter__(self):
print "entered"
# self.open()
def __exit__(self, type, value, traceback):
print "__exit__"
self.close()
メイン.PY
def myfunc(filename):
with WRITER.Writer(filename) as writeit:
# do some stuff
writeit.write("hallo")
# do some more stuff
writeit.write("more results")
# even more stuff
writeit.write("goodbye")
しかし、私が実行するmyfunc()
と、オブジェクトは終了するとすぐにガベージコレクションされ__init__()
ます. これは enter から exit までまっすぐ進み、with ステートメントの後には何の役割も果たしません。オープンを に入れても に入れても問題ないよう__init__
です__enter__
。
出力:
Traceback (most recent call last):
File "/shared/GitHub/Tesera/MRAT_Refactor/bin/MAIN.py", line 13, in <module>
myfunc("./tempfile")
File "/shared/GitHub/Tesera/MRAT_Refactor/bin/MAIN.py", line 6, in myfunc
writeit.write("hallo")
AttributeError: 'NoneType' object has no attribute 'write'
entered
__exit__
このようにコンテキストマネージャーを使用する方法、より良い使用方法__del__
はありますか...またはこれを達成するための3番目のオプションはありますか?