2017-01-25 41 views
0
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])) 

我已经构建了上面的代码作为示例。 我收到以下输出:Iter内置函数与类

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

据我了解:iter()应该返回一个迭代器对象,但你可以看到,当我进入功能iter()对象Kids它返回一个Kids对象,而不是一个迭代的目的。

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

+0

那么,你的'__iter__'方法*不*回报'self'。这意味着'Kids'实例本身就是迭代器。 –

回答

3

因为您返回从Kids.__iter__self,而不是一个特殊的iterator对象list对象做(list_iterator)。

您的班级本身是迭代器,因为它定义了__iter____next__

相反,如果你想为Kids类单独的对象来处理迭代(并且有充分的理由要这么做),创建一个Kids_Iterator对象,它定义__iter____next__Kids.__iter__返回一个新的Kids_Iterator类的实例。

1

这是因为你是在类设置__iter__当覆盖iter()行为。正如你所看到的,你回归自我,所以你基本上重新定义了什么iter(Kids)

实施此操作的正确方法是yield,而不是__iter__中的return。当然,如果你打算把它和for循环结合起来,这当然是有意义的,这样你可以迭代多个对象。否则__iter____next__将只给你一个对象实例。