我在Stack Overflow上找到了此Tee
代码,它非常适合记录交互式python shell会话。我理解OOP可以,但是我不确定:a)在此特定代码中如何调用方法。如何调用方法readline()
? b)而且我读到__del__
与构造函数几乎相反,但是对于何时调用该函数,我也感到困惑。
import code
import sys
class Tee(object):
def __init__(self, log_fname, mode='a'):
self.log = open(log_fname, mode)
def __del__(self):
# Restore sin, so, se
sys.stdout = sys.__stdout__
sys.stdir = sys.__stdin__
sys.stderr = sys.__stderr__
self.log.close()
def write(self, data):
self.log.write(data)
sys.__stdout__.write(data)
def readline(self):
s = sys.__stdin__.readline()
self.log.write(s)
return s
# Tie the ins and outs to Tee.
sys.stdout = sys.stderr = sys.stdin = Tee('consolelog.dat', 'w')
console = code.InteractiveConsole()
console.interact()
答案 0 :(得分:0)
该代码段使用实现通用协议(在这种情况下为.write
和.readline
的自定义文件状对象,覆盖了标准输入,标准输出和标准错误。 code.InteractiveConsole
使用sys.stdin
等进行输入和输出,因此,通过覆盖它们,基本上可以将流传输到对象中。
答案 1 :(得分:0)
a)
默认情况下,sys.stdin
设置为sys.__stdin__
。调用input
或类似函数时,将调用sys.stdin.readline
(实际上是sys.__stdin__.readline
的下面)
将sys.stdin
设置为Tee
的实例时,sys.stdin.readline
现在调用Tee.readline
。
b)它的解构函数,当对象从内存中释放时被调用。通常,当不再有对该对象的引用时,垃圾收集器就会执行此操作。