Iter内置函数与类

时间:2017-01-25 13:33:17

标签: python python-3.x class

class Kids():
    def __init__(self, list_of_kids):
        self.kids = list_of_kids

    def __next__(self):
        return 'kawabanga'
    def __iter__(self):
        return self

kid = Kids([1,2,3])
kids_iter = iter(kid)
print(kid)
print(kids_iter)
print(iter([1,2,3]))

我已经将上面的代码构建为一个例子。 我收到以下输出:

<__main__.Kids object at 0x102977b38>
<__main__.Kids object at 0x102977b38>
<list_iterator object at 0x102977be0>

据我所知:iter()应该返回一个迭代器对象,但正如您在我输入函数iter()时所看到的那样,对象Kids会返回Kids对象而不是迭代器对象。

当我在对象iter()上调用Kids时,能否解释一下为什么它不会返回迭代器对象?

2 个答案:

答案 0 :(得分:3)

因为您从self返回Kids.__iter__而不是iterator对象,而list对象请{(1}})。

您的类 本身就是迭代器,因为它定义了list_iterator__iter__

相反,如果您想要在__next__类的单独对象上处理迭代(并且有很多理由想要这样做),请创建一个Kids对象来定义{{ 1}}和Kids_Iterator并使__iter__返回__next__类的新实例。

答案 1 :(得分:1)

这是因为您在课堂上设置iter()时会覆盖__iter__行为。如您所见,您返回self,因此您基本上重新定义了iter(Kids)所做的事情。

实现此目的的正确方法是yield,而不是return中的__iter__。当然,如果你计划将它与for循环结合起来,那么这只是有意义的,这样你就可以迭代多个对象。否则__iter____next__只能为您提供一个对象实例。