2017-01-25 47 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__將只給你一個對象實例。