Ответ 1
Из docs:
Если контейнер объектов
__iter__()
метод реализуется как генератор, он автоматически вернет итератора (технически, объекта генератора)__iter__()
иnext()
.
У меня есть следующий код в 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__
возвращает генератор python (см. документация), поскольку он использует yield
.
Генератор автоматически предоставит следующий() метод; цитируя документацию:
Что делает настолько компактные генераторы, что методы __iter __() и next() создаются автоматически.
ИЗМЕНИТЬ:
Генераторы действительно полезны. Если вы не знакомы с ними, я предлагаю вам почитать их и поиграть с некоторым тестовым кодом.
Вот еще информация об итераторах и генераторах от fooobar.com/info/13/....