Как метод readline () вызывается в этом коде? - PullRequest
0 голосов
/ 28 сентября 2018

Я нашел этот Tee код здесь в переполнении стека, и он очень хорошо работает для регистрации сеанса интерактивной оболочки Python.Я хорошо понимаю ООП, однако я не уверен, что: а) как методы вызываются в этом конкретном коде.Как вызывается метод readline()?б) И я прочитал, что __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 голосов
/ 28 сентября 2018

а) По умолчанию sys.stdin установлено на sys.__stdin__.Когда вызывается input или аналогичные функции, вызывается sys.stdin.readline (что на самом деле означает sys.__stdin__.readline) Когда для sys.stdin задан экземпляр Tee, sys.stdin.readline теперь вызывает Tee.readline.

b) Его называют деконструктором и вызывают, когда объект освобождается из памяти.Обычно сборщик мусора делает это, когда больше нет ссылок на объект.

0 голосов
/ 28 сентября 2018

Фрагмент кода переопределяет стандартную входную, стандартную выходную и стандартную ошибку с помощью пользовательского файлового объекта, который реализует общий протокол (.write и .readline в данном случае).code.InteractiveConsole использует sys.stdin и т. Д. Для ввода и вывода, поэтому, переопределяя их, вы в основном направляете поток в ваш объект.

...