我在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
在你的答案中,请尝试使用代码示例而不是文本,因为我的英语不是很好。谢谢。
答案 0 :(得分:35)
来自docs:
如果容器对象是
__iter__()
方法实现为生成器, 它会自动返回 迭代器对象(技术上,a 发电机对象)供应__iter__()
和next()
方法。
答案 1 :(得分:13)
__iter__
方法返回python 生成器(请参阅documentation),因为它使用yield
关键字。
生成器将自动提供next()方法;引用文档:
使生成器如此紧凑的原因是创建了__iter __()和next()方法 自动。
编辑:
发电机非常有用。如果您不熟悉它们,我建议您阅读它们,并使用一些测试代码。
以下是StackOverflow中有关迭代器和生成器的更多信息。