下面的代码创建了一个“tee”对象,它将标准输出发送到文件和终端。如果del t在我完成开球后执行以下操作,则不会删除对象并且不会__del__()调用成员(因此开球会继续):t = tee("foo.txt")print("bar")del t但如果我__del__()直接打电话,一切正常:t = tee("foo.txt")print("bar")t.__del__()为什么不del工作?这样做的正确方法是什么?class tee(): def __init__(self, filepath): self.old_stdout = sys.stdout self.old_stderr = sys.stderr self.name = filepath sys.stdout = self sys.stderr = self def write(self, text): self.old_stdout.write(text) with open(self.name, 'a', encoding="utf-8") as f: f.write(text) def flush(self): pass def __del__(self): sys.stdout = self.old_stdout sys.stdout = self.old_stderr
2 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
Note
del x
不直接调用x.__del__()
——前者将 x 的引用计数减一,后者仅在 x 的引用计数达到零时调用。
取自Python 3 文档的数据模型部分。
您已经在构造函数中引用了该类:
sys.stdout = self sys.stderr = self
引用将保留,因此对象将保持“活动”状态。
添加回答
举报
0/150
提交
取消