此类如何实现"__iter__"没有实现“下一个"的方法? [英] How does this class implement the "__iter__" method without implementing "next"?

查看:100
本文介绍了此类如何实现"__iter__"没有实现“下一个"的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆