Module (4%)
Section (25%)

Генераторы - где их найти: продолжение

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

Код не очень сложный, но он ясно представляет концепцию.

Посмотрите на код в редакторе.

 

Мы встроили итератор Fib в другой класс (можно сказать, что мы провели его композицию в класс Class). Он создается вместе с объектом Class.

Объект класса может использоваться как итератор, когда (и только когда) он положительно отвечает на вызов __iter__ - этот класс может это сделать, и если он вызывается таким образом, он предоставляет объект, способный подчиняться протоколу итерации.

Вот почему вывод кода такой же, как и ранее, хотя объект класса Fib явно не используется внутри цикла for.



Code

class Fib:
def __init__(self, nn):
self.__n = nn
self.__i = 0
self.__p1 = self.__p2 = 1

def __iter__(self):
print("Fib iter")
return self

def __next__(self):
self.__i += 1
if self.__i > self.__n:
raise StopIteration
if self.__i in [1, 2]:
return 1
ret = self.__p1 + self.__p2
self.__p1, self.__p2 = self.__p2, ret
return ret


class Class:
def __init__(self, n):
self.__iter = Fib(n)

def __iter__(self):
print("Class iter")
return self.__iter


object = Class(8)

for i in object:
print(i)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×