没有__iter __()方法的类生成器,但是对象实例与next()一起使用

时间:2015-09-29 17:29:20

标签: python

我正在尝试理解具有类的代码来创建一个生成器,该生成器稍后将使用内置的next()小说进行迭代。

有问题的课程是:

Class MyGen():
    def __init__(self):
    """ Define some instance attributes"""
        self.foo = 'bar'
        self.some_attribute = 0
    def __next__(self):
        if self.some_attribute < some_condition:
            new_value = self.argument1
            self.some_attribute += 1
            return new_value

在全局函数中,返回的对象由next()内置函数迭代。那是......

gen = Mygen()
next(gen) # Returns values

我不明白如果没有__iter__()方法,该类如何成为生成器。是个  从类中生成生成器所需的__iter__()方法?在我搜索的任何地方,似乎__iter__()__next__()一起用于从类创建生成器。

我对Python很新。这个代码示例是我最好的尝试,以显示我遇到的问题,因为实际的代码做得更多,并且会减少问题并且太长而无法放在这里。我的经验不足以知道如何缩短它或者需要更多信息。

2 个答案:

答案 0 :(得分:3)

next(x)在大多数情况下非常直接转换为x.__next__()

因此,在没有__next__成为&#34;真实&#34;的情况下调用您的gen方法发生器。

调用有效,它只是一个简单的方法调用(不做任何假设或检查对象)。

答案 1 :(得分:1)

对象上的__iter__方法应返回该对象的迭代器。它应该被定义为任何可迭代的对象,并由内置iter()函数或各种语句调用(例如在for i in obj:循环的初始化步骤中)

迭代器只是一个__next__方法,可以返回迭代的下一个项目,或者在没有项目的情况下引发StopIteration。它由内置next()函数调用,并在各种情况下调用(例如,在for循环的正文之前)

生成器是一个可迭代的,它很可能是不可重复的,因此它经常被表示为一个迭代器,它也是一个迭代器。因此,对于大多数生成器,他们定义了一个__next__方法来生成下一个元素,以及一个只返回self的__iter__方法。