Python __del_u不可靠,但如果我尝试使用上下文管理器,对象不会持久化

Python __del_u不可靠,但如果我尝试使用上下文管理器,对象不会持久化,python,with-statement,contextmanager,del,resource-cleanup,Python,With Statement,Contextmanager,Del,Resource Cleanup,我有一个脚本,它实例化了许多子对象。当脚本和这些对象结束时,这些对象需要做一些清理,特别是临时文件关闭和删除 我一直在读到_udel_uu_uu是多么不可靠——但是上下文管理似乎不起作用,因为子对象不会持久存在。他们需要四处闲逛,做文件读写之类的事情 例如: WRITER.PY import os class Writer(object): def __init__(self, filename): self.filename = filename se

我有一个脚本,它实例化了许多子对象。当脚本和这些对象结束时,这些对象需要做一些清理,特别是临时文件关闭和删除

我一直在读到_udel_uu_uu是多么不可靠——但是上下文管理似乎不起作用,因为子对象不会持久存在。他们需要四处闲逛,做文件读写之类的事情

例如:

WRITER.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()
MAIN.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__;时会被垃圾收集。它直接从入口到出口,在with语句之后不执行任何任务。不管我是在uu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

输出:

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__            

有没有一种方法可以这样使用上下文管理器,一种更好的方法可以使用uu del_u…或者有第三种方法可以实现这一点?

这个问题与垃圾收集无关。As子句绑定了uu enter_uu方法的返回值。你没有归还任何东西,所以你没有得到任何东西


如果希望返回Writer对象,则需要在uu enter uu方法的末尾执行return self。

该问题与垃圾收集无关。As子句绑定了uu enter_uu方法的返回值。你没有归还任何东西,所以你没有得到任何东西


如果希望返回Writer对象,则需要在uu enter uu方法末尾执行return self操作。

谢谢您的编辑。那是凌晨2点我的时间,我不能;I don’我想不出那些标签了:谢谢你的编辑。那是凌晨2点我的时间,我不能;I don’我想不出那些标签了:-谢谢你的澄清!我已经阅读了文档,没有掌握这方面的内容。感谢您的澄清!我已经阅读了文档,但没有掌握这方面的知识。