下面的代码创建一个“ 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
答案 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方法。但这不会发生,因为您的对象仍然被标准输出引用。