Python備忘録:クラス定義によるジェネレータ

ジェネレータの性格を持ったクラスを定義することができる。例を示す:


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
>>> 

となる。