Итерируемый Производный класс из файлового класса в Python 2.6 - PullRequest
0 голосов
/ 05 мая 2019

У меня есть обходной путь, но я все еще думаю о лучшем способе достижения моей цели. Я хочу, чтобы класс, производный от базового класса file , обращался к файлу построчно, но, между прочим, получал номер строки. Что-то вроде встроенной функции перечисления .

Я думаю, что класс должен быть таким:

class file2(file):
  def __init__(self, filename):
    file.__init__(self, filename)
    self._num_line = 0

  def __iter__(self):
    self._num_line = 0
    ?

чтобы достичь этого

f2 = file2('myfile.txt')
for num_line, line in f2:
  ...

Моя текущая опция - создать генератор внутри дочернего класса:

    def lines(self):
        for line in self:
            self._num_line += 1
            yield (self._num_line, line)

но использование уродливо (ну, не так питонно, как хотелось бы):

f2 = file2('myfile.txt')
gen = f2.lines()
for i, lin in gen:
   ...

Есть ли простой способ добиться этого? Заранее спасибо,

1 Ответ

1 голос
/ 05 мая 2019

Ваш __iter__ метод может иметь ту же самую реализацию, что и def lines(self):

В качестве альтернативы вы можете сделать:

def __iter__(self):
    return enumerate(file.__iter__(self))

Или, возможно

def __iter__(self):
    return enumerate(super(file, self).__iter__())

Обратите внимание, я не должен поощрять это, потому что это нарушает принцип замещения Лискова. Ваш метод iter теперь возвращает итератор кортежей, а не итератор строк. Просто используйте enumerate на самом объекте. Зачем вообще использовать наследование?

...