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

How is the readline() method called in this code?

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

该代码片段使用实现通用协议(在本例中为 .write.readline)的自定义类文件对象覆盖标准输入、标准输出和标准错误。 code.InteractiveConsole 使用 sys.stdin 等作为输入和输出,因此通过覆盖它们,您基本上是将流通过管道输送到您的对象中。

一个) 默认情况下,sys.stdin 设置为 sys.__stdin__。当调用input或类似的函数时,会调用sys.stdin.readline(下面实际上是sys.__stdin__.readline) 当 sys.stdin 设置为 Tee 的实例时,sys.stdin.readline 现在调用 Tee.readline.

b) 它称为析构函数,当对象从内存中释放时调用。通常垃圾收集器在不再引用该对象时执行此操作。