关于类:python中自定义类的迭代器抛出python中的错误

iterator on custom classes in python throws error in python

本问题已经有最佳答案,请猛点这里访问。

我是一个使用迭代器的名为queue的定制类wring。我在一个名为iterator.py的单独文件中有一个Iterator class。当我尝试使用for循环迭代时,会得到下面的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 from iterator import Iterator
    class Abstractstruc(object):
        def __init__(self):
            assert False
        def __str__(self):
            return"<%s: %s>" %(self.__class__.__name__,self.container)

class Queue(Abstractstruc,Iterator):

    def __init__(self, objecttype=object):
        self.container=[]
        self.size=0

    def add(self, data):
        self.container.append(data)


    def  remove(self):
        self.container.pop(0)


    def __getitem__(self,index):
        return self.container[index]


    def __iter__(self):
        return Iterator(self.container)

if __name__=='__main__':

    q=Queue(int)
    q.add(5)
    q.add(4)
    q.add(6)

    for i in q:
       print i

迭代器

1
2
3
4
5
6
7
8
9
10
11
12
class Iterator(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
        self.offset = 0

    def __next__(self):
        if self.offset>=len(self.wrapped):
            raise StopIteration
        else:
            item = self.wrapped[self.offset]
            self.offset+=1
            return item

我收到这个错误消息

1
2
3
4
5
6
7
<Queue: [5, 4, 6]>
<Queue: [4, 6]>
4
Traceback (most recent call last):
  File"queue.py", line 78, in <module>
    for i in q:
TypeError: iter() returned non-iterator of type 'Iterator'

我不明白它为什么不返回迭代器。这里需要什么修复?


迭代器本身必须实现__iter__。他们只需返回self。在docs中,注意自定义迭代器对象必须支持__iter__以支持forin语句。还有,作为@ Rob?注意,由于您使用的是python 2而不是3,所以需要实现next(),而不是__next__()


这是因为next()方法不应该具有魔力,您不需要双下划线。如前所述,python 3是不同的。

1
def next(self):