Следующий элемент итератора в ООП в Python
Итератор выдает элементы через метод
__next__. Когда элементы
закончились, метод должен выбросить
исключение StopIteration.
Давайте сделаем отдельный класс- итератор для чисел:
class NumbersIter:
def __init__(self, data):
self.__data = data
self.__index = 0
def __iter__(self):
return self
def __next__(self):
if self.__index >= len(self.__data):
raise StopIteration
elem = self.__data[self.__index]
self.__index += 1
return elem
Метод __iter__ коллекции вернет
объект этого класса:
class Numbers:
def __init__(self):
self.__data = [1, 2, 3]
def __iter__(self):
return NumbersIter(self.__data)
Создадим коллекцию и переберем ее в цикле:
nums = Numbers()
for num in nums:
print(num)
Цикл сам вызовет __iter__,
затем многократно __next__,
пока не придет StopIteration.
Сделаем итератор для списка сотрудников:
class WorkersIter:
def __init__(self, data):
self.__data = data
self.__index = 0
def __iter__(self):
return self
def __next__(self):
if self.__index >= len(self.__data):
raise StopIteration
elem = self.__data[self.__index]
self.__index += 1
return elem
class Employee:
def __init__(self, name):
self.name = name
class Workers:
def __init__(self):
self.__data = [
Employee('john'),
Employee('smit'),
]
def __iter__(self):
return WorkersIter(self.__data)
Переберем сотрудников:
workers = Workers()
for worker in workers:
print(worker.name)
Сделайте класс NumbersIter
с методом __next__.
Подключите его в __iter__
класса Numbers.
Сделайте класс WorkersIter
и верните его из __iter__
класса Workers.
В __next__ при окончании данных
выбрасывайте StopIteration.