这段代码中的 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) 它称为析构函数,当对象从内存中释放时调用。通常垃圾收集器在不再引用该对象时执行此操作。
我在 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) 它称为析构函数,当对象从内存中释放时调用。通常垃圾收集器在不再引用该对象时执行此操作。