为什么 del <object> 不删除它?

下面的代码创建了一个“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


当年话下
浏览 197回答 2
2回答

慕田峪4524236

Notedel x不直接调用x.__del__()——前者将 x 的引用计数减一,后者仅在 x 的引用计数达到零时调用。取自Python 3 文档的数据模型部分。您已经在构造函数中引用了该类:sys.stdout&nbsp;=&nbsp;self sys.stderr&nbsp;=&nbsp;self引用将保留,因此对象将保持“活动”状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python