Используя хвост и буфер для получения последних K строк в файле

Мне дали этот буфер и сказали сделать обратный ввод, чтобы получить последние K строк в файле. Из того, что я пытался сделать, каждый раз, когда я пытался запустить код, он говорит, что used не является атрибутом Input. Может кто-нибудь сказать мне, почему это происходит? Заранее спасибо.

class Input:
def __init___( self, file ):
    self.file = file # must open( <filename>, "rb" )
    self.length = 0
    self.used = 0
    self.buffer = ""
def read( self ):
    if self.used < self.length:  # if something in buffer 
        c = self.buffer[self.used]
        self.used += 1
        return c
    else:
        self.buffer = self.file.read( 20 ) # or 2048
        self.length = len( self.buffer )
        if self.length == 0:
            return -1
        else:
            c = self.buffer[0]
            self.used = 1

     `

2 ответа

Решение

Я собираюсь выйти на конечности здесь и попытаться угадать, что проблема в том, что вы используете неправильное имя для __init__ магический метод (как заметил Hai Vu). Обратите внимание, что в вашем коде три заключительных подчеркивания вместо двух.

Так как __init__ Метод вызывается при создании объекта для установки его различных атрибутов, used атрибут никогда не устанавливается, потому что __init__ функция никогда не запускается.

После этого, used является первым атрибутом, доступным в Input.read, что заставляет Python жаловаться на его отсутствие.

Если я прав, удалите подчеркивание, и это решит проблему (хотя могут быть и другие).

Попробуйте сделать отступ...

class Input:
    def __init___( self, file ):
        self.file = file # must open( <filename>, "rb" )
        self.length = 0
        self.used = 0
        self.buffer = ""
    def read( self ):
        if self.used < self.length:  # if something in buffer 
            c = self.buffer[self.used]
            self.used += 1
            return c
        else:
            self.buffer = self.file.read( 20 ) # or 2048
            self.length = len( self.buffer )
            if self.length == 0:
                return -1
            else:
                c = self.buffer[0]
                self.used = 1
Другие вопросы по тегам