这段代码中如何调用readline()方法?

时间:2018-09-28 03:00:22

标签: python override stdout sys tee

我在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()

2 个答案:

答案 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)它的解构函数,当对象从内存中释放时被调用。通常,当不再有对该对象的引用时,垃圾收集器就会执行此操作。