Skip to main content
 首页 » 编程设计

python之__del__ 不可靠,但如果我尝试使用上下文管理器,对象不会持久存在

2025年05月04日12sharpest

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

我一直在阅读 __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__() 后立即被垃圾回收。它直接从进入到退出并且不执行 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__ ...或者是否有第三种选择来实现这一点?

请您参考如下方法:

这个问题与垃圾收集无关。作为documented , as子句绑定(bind) __enter__ 的返回值方法。你没有返回任何东西,所以你得到 None。

如果你想要 Writer要返回的对象,你需要做return self在 __enter__ 的末尾方法。