ジェネレータの性格を持ったクラスを定義することができる。例を示す:
class Reverse:
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
このクラス定義で__next__
メソッドがあることが重要である。このメソッドがnext
関数の定義をなしている(これはクラスの__str__
メソッドがそのクラスの固有のprint
関数の定義になっていることと同じである)。__iter__
メソッドも同様にiter
関数を定義するものであるが今は何もしない。
結果は
>>> s = Reverse('flog')
>>> next(s)
'g'
>>> next(s)
'o'
>>> next(s)
'l'
>>> next(s)
'f'
>>> next(s)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in
next(s)
File "<pyshell#0>", line 11, in __next__
raise StopIteration
StopIteration
>>>
となる。