Класс, предоставляющий итератор для содержимого - PullRequest
0 голосов
/ 21 марта 2020

Существует множество документов о том, как класс Python может реализовать протокол итератора с нуля, предоставляя методы __iter__ и __next__.

Но предположим, что каждый объект будет содержать только список Он называется, например, contents, и цель состоит в том, чтобы попытаться выполнить итерации по объекту, в конечном итоге следует выполнить итерацию по списку contents. Такое ощущение, что должен быть более простой способ обеспечить это.

Каков простой / идиоматический c способ для класса обеспечить итерацию по списку содержимого?

Ответы [ 2 ]

3 голосов
/ 21 марта 2020
def __iter__(self):
    return iter(self.contents)

Реализация протокола итератора является неправильным способом обеспечения поддержки итерации. Если вы хотите обеспечить поддержку итерации, вам нужен метод __iter__, который возвращает итератор. В большинстве случаев ваш объект не должен быть итератором, а ваш объект не должен иметь метод __next__.

1 голос
/ 21 марта 2020

Просто верните итератор для переменной-члена, которую вы хотите повторить.

class Foo:

    def __init__(self, some_sequence):
        self.contents = list(some_sequence)

    def __iter__(self):
        return iter(self.contents)

В этом примере я превратил начальную последовательность в список, чтобы несколько итераций объекта go снова проходили через список. Если вы не сделаете list, то получите любую итерацию, которая нравится исходной последовательности (файловый объект или итератор будет только go проходить последовательность один раз).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...