Найти тему
4 подписчика

Долго пытался понять, в чём смысл переписывать простой генератор чисел Фибоначчи типа:


def fib(max):

a, b = 0, 1

while a < max:

yield a

a, b = b, a + b

... зачем описывать его в виде класса? Это же гораздо длинней:

class Fib:

def __init__(self, max):

self.max = max

def __iter__ (self):

self.a = 0

self.b = 1

def __next__(self):

fib = self.a

if fib > self.max:

raise StopIteration

self.a, self.b = self.b, self.a + self.b

return fib

К тому же в переводе "Погружения в Питон 3" не хватает страниц — пришлось лезть в оригинал. Ответ оказался даже не в основном тексте, а во врезке. Суть в чём: __init__, __iter__, __next__ — это специальные, заранее предопределенные в Питоне методы, добавление которых в класс позволяет обращаться к его экземплярам, как к соответствующего типа объектам. В данном случае был создан итератор, и если его отдать циклу for, то он без труда его опознает.
Около минуты