Как этот класс реализует метод "__iter__" без реализации "следующего"?

У меня есть следующий код в django.template:

class Template(object):
    def __init__(self, template_string, origin=None, name='<Unknown Template>'):
        try:
            template_string = smart_unicode(template_string)
        except UnicodeDecodeError:
            raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.")
        if settings.TEMPLATE_DEBUG and origin is None:
            origin = StringOrigin(template_string)
        self.nodelist = compile_string(template_string, origin)
        self.name = name

    def __iter__(self):
        for node in self.nodelist:
            for subnode in node:
                yield subnode

    def render(self, context):
        "Display stage -- can be called many times"
        return self.nodelist.render(context)

Часть, с которой я запутался, ниже. Как работает этот метод __iter__? Я не могу найти соответствующий метод next.

def __iter__(self):
        for node in self.nodelist:
            for subnode in node:
                yield subnode

Это единственный способ, которым я знаю, как реализовать __iter__:

class a(object):
    def __init__(self,x=10):
        self.x = x
    def __iter__(self):
        return self
    def next(self):
        if self.x > 0:
            self.x-=1
            return self.x
        else:
            raise StopIteration
 ainst = a()
 for item in aisnt:
     print item

В ваших ответах попробуйте использовать примеры кода, а не текст, потому что мой английский не очень хорош. Спасибо.

Ответы

Ответ 1

Из docs:

Если контейнер объектов __iter__()метод реализуется как генератор, он автоматически вернет итератора (технически, объекта генератора) __iter__() и next().

Ответ 2

Этот метод __iter__ возвращает генератор python (см. документация), поскольку он использует yield. Генератор автоматически предоставит следующий() метод; цитируя документацию:

Что делает настолько компактные генераторы, что методы __iter __() и next() создаются автоматически.

ИЗМЕНИТЬ:

Генераторы действительно полезны. Если вы не знакомы с ними, я предлагаю вам почитать их и поиграть с некоторым тестовым кодом.

Вот еще информация об итераторах и генераторах от fooobar.com/info/13/....