此类如何实现"__iter__"没有实现“下一个"的方法? [英] How does this class implement the "__iter__" method without implementing "next"?
问题描述
我在django.template中有以下代码:
I have the following code in 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
方法.
The part I am confused about is below. How does this __iter__
method work? I can't find any corresponding next
method.
def __iter__(self):
for node in self.nodelist:
for subnode in node:
yield subnode
这是我知道如何实现__iter__
的唯一方法:
This is the only way that I know how to implement __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
在您的答案中,请尝试使用代码示例而非文本,因为我的英语不是很好.谢谢.
In your answers, please try to use code examples rather than text, because my English is not very good. Thank you.
推荐答案
来自 docs :
如果容器对象的
__iter__()
方法被实现为生成器, 它将自动返回一个 迭代器对象(从技术上讲, 生成器对象)提供__iter__()
和__next__()
方法.
If a container object’s
__iter__()
method is implemented as a generator, it will automatically return an iterator object (technically, a generator object) supplying the__iter__()
and__next__()
methods.
以下是您使用生成器提供的示例:
Here is your provided example using a generator:
class A():
def __init__(self, x=10):
self.x = x
def __iter__(self):
for i in reversed(range(self.x)):
yield i
a = A()
for item in a:
print(item)
这篇关于此类如何实现"__iter__"没有实现“下一个"的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!