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

时间:2018-11-11 18:14:31

标签: python

下面的代码创建一个“ tee”对象,将stdout发送到文件以及终端。

如果在完成准备工作后执行以下var arr1 =['Five','Four','Full','Straight','Three','Two','One','Bust'] var arr2 = [{'player1-box': "One"},{'player2-box': "Five"},{'player3-box': "Four"},{'player1-box': "Three"},{'player2-box': "Three"},{'player3-box': "Two"},{'player1-box': "Five"},{'player2-box': "One"},{'player3-box': "One"}] function findFirst(keys, players){ for (key of keys){ let player = players.filter(player => Object.values(player).includes(key)) if (player) return player } } console.log(findFirst(arr1, arr2)),则不会删除对象,也不会调用del t成员(因此准备工作继续进行):

__del__()

但是,如果我直接致电t = tee("foo.txt") print("bar") del t ,一切正常:

__del__()

t = tee("foo.txt") print("bar") t.__del__() 为什么不起作用?什么是正确的方法?

del

2 个答案:

答案 0 :(得分:7)

  

请注意,del x不会直接调用x.__del__()-前者将x的引用计数减一,而后者仅在x的引用计数达到零时才调用。   
取自Python 3文档的data model部分。

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

sys.stdout = self
sys.stderr = self

引用将保留,因此对象将保持“ <活动> ”。

答案 1 :(得分:2)

您真正要寻找的是用于特定上下文的with-statement。您打开文件,对其进行处理,然后再次关闭。

with tree(“foo.txt) as t:
    t.write(“bar”)

这将最终调用exit方法。

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 __exit__(self):
        sys.stdout = self.old_stdout
        sys.stdout = self.old_stderr

实际上,您的类正在使用write方法中的文件处理程序执行相同的操作。

对于delete方法:如前所述,delete语句只会减少引用计数器。一旦引用数达到零,该对象将被垃圾回收,并调用delete方法。但这不会发生,因为您的对象仍然被标准输出引用。