为什么del <object>没有删除它?

ner*_*com 3 python

下面的代码创建了一个"tee"对象,它将stdout发送到文件以及终端.

如果del t在我完成T恤时如下所示,则不会删除该对象,并且不会__del__()调用该成员(因此继续进行):

t = tee("foo.txt")
print("bar")
del t
Run Code Online (Sandbox Code Playgroud)

但如果我__del__()直接打电话,事情就好了:

t = tee("foo.txt")
print("bar")
t.__del__()
Run Code Online (Sandbox Code Playgroud)

为什么不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
Run Code Online (Sandbox Code Playgroud)

小智 7

注意del x不直接调用x.__del__()- 前者将x的引用计数递减1,而后者仅在x的引用计数达到零时调用.
摘自Python 3文档的数据模型部分.

您已在构造函数中引用了类:

sys.stdout = self
sys.stderr = self
Run Code Online (Sandbox Code Playgroud)

参考将保留,因此对象将保持"活着".

  • @ nerdfever.com:您似乎忘记了存储在`sys.stdout`和`sys.stderr`中的两个引用. (8认同)