2011-12-09 20 views
2

我正在學習Python我沒有得到一件事。考慮以下代碼:__getitem__ for循環中的調用

class Stack: 
    def __init__(self): 
     self.items = [] 

    def push(self, item): 
     self.items.append(item) 

    def pop(self): 
     return self.items.pop() 

    def __getitem__(self,index): 
     print "index",index 
     return self.items[index] 

    def __len__(self): 
     return len(self.items) 


stack = Stack() 
stack.push(2) 
stack.push(1) 
stack.push(0) 

for item in stack: 
    print item 

和輸出

index 0 
2 
index 1 
1 
index 2 
0 
index 3 

爲什麼的GetItem調用四次?

回答

9

for循環不知道如何迭代你的對象,因爲你沒有實現__iter__(),所以它使用默認的迭代器。這從索引0開始,直到通過索引索引3得到IndexError。請參閱http://effbot.org/zone/python-for-statement.htm

順便說一句,如果你從list派生出來的話,你的實現將會簡單得多。您不需要__init__(),pop()__getitem__()push可能只是append的另一個名稱。另外,因爲list有一個完美的__iter()__方法,for將知道如何迭代它,而不會超過列表的末尾。

class Stack(list): 
    push = list.append 
+0

實際上,我的原始代碼有它,看到更新。這是相同的。 –

+0

是的,我錯了細節。原來是'__iter __()'而不是'__len __()'。現在解決這個問題。 – kindall

+0

優秀。 BTW任何更好的方式來實現這個比def _iter __(self): for self in.items: yield i –