Генераторы - где их найти: продолжение
В предыдущем примере показано решение, в котором объект итератора является частью более сложного класса.
Код не очень сложный, но он ясно представляет концепцию.
Посмотрите на код в редакторе.
Мы встроили итератор 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 }}
×