Как этот класс реализует “__ проход __” метод, не реализовывая “затем”?

У меня есть следующий код в 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

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

21
задан Daniel Pryden 25 December 2009 в 03:16
поделиться

2 ответа

Из docs:

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

39
ответ дан 29 November 2019 в 06:51
поделиться

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

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

EDIT:

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

Вот дополнительная информация об итераторах и генераторах из StackOverflow.

.
15
ответ дан 29 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: