python中自定义类的迭代器在python中抛出错误

时间:2013-11-22 22:20:23

标签: python class object iterator

我正在使用一个名为queue的自定义类,它使用迭代器。我在一个名为iterator.py的单独文件中有一个Iterator class。当我尝试使用for循环迭代时,我收到以下错误。

 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

iterator.py

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

我收到此错误消息

<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'

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

2 个答案:

答案 0 :(得分:3)

迭代器必须自己实现__iter__。他们可以返回self。从docs开始,请注意自定义迭代器对象必须支持__iter__才能支持forin语句。另外,正如@Robᵩ所说,由于您使用的是Python 2而不是3,因此您需要实现next(),而不是__next__()

答案 1 :(得分:1)

那是因为next()方法不应该是魔术,你不需要双重下划线。如前所述,Python 3是不同的。

def next(self):