Python __for循环中的getitem\uuuuu调用

Python __for循环中的getitem\uuuuu调用,python,Python,我正在学习Python,我一点也不懂。考虑这个代码: 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",in

我正在学习Python,我一点也不懂。考虑这个代码:

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四次?

for循环不知道如何具体迭代对象,因为您没有实现
\uuu iter()
,所以它使用默认迭代器。这从索引0开始,直到通过请求索引3获得
索引器。看

顺便说一句,如果您从
列表
派生,您的实现会简单得多。您不需要
\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。另外,由于
列表
有一个非常好的
iter()方法,因此
for
将知道如何在不超过列表末尾的情况下迭代它

class Stack(list):
    push = list.append

事实上,我的原始代码有它,请参阅更新。是的,我在细节上错了。原来是
\uu iter\uuuuuu()
而不是
\uuuuu len\uuuuuu()
。现在把它修好,太好了。顺便说一句,有没有比定义(self)更好的方法来实现这一点呢