1

多数の子オブジェクトをインスタンス化するスクリプトがあります。スクリプト (およびこれらのオブジェクト) が終了すると、オブジェクトは少しクリーンアップする必要があります (特に一時ファイルのクローズと削除)。

私はどのよう__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番目のオプションはありますか?

4

1 に答える 1

8

この問題はガベージ コレクションとは関係ありません。文書化されているように、as句は__enter__メソッドの戻り値をバインドします。何も返さないので、None を取得します。

Writerオブジェクトを返したい場合は、メソッドreturn selfの最後で行う必要があります。__enter__

于 2014-12-21T08:17:15.197 に答える