У меня есть следующий код в 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
В Ваших ответах попытайтесь использовать примеры кода, а не текст, потому что мой английский язык не очень хорош.Спасибо.
Из docs:
Если объект контейнера
__iter__()
... метод реализован в виде генератора, он автоматически вернет объект итератора (технически генераторный объект), снабжающий__iter__()
иnext()
.
Этот метод __iter__
возвращает питоновый генератор (см. документацию ), так как он использует ключевое слово урожайности
.
Генератор автоматически предоставит метод next(); цитируя документацию:
Что делает генераторы настолько компактными, так это то, что создаются методы __iter__() и next() автоматически.
EDIT:
Генераторы действительно полезны. Если вы не знакомы с ними, предлагаю вам почитать о них и поиграть с некоторым тестовым кодом.
Вот дополнительная информация об итераторах и генераторах из StackOverflow.
.