2011-12-09 4 views
2

저는 파이썬을 배우고 있습니다. 한 가지를 얻지 못합니다.for 루프에서 __getitem__ 호출

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 

출력을 네 번 의 getItem라고 왜

index 0 
2 
index 1 
1 
index 2 
0 
index 3 

:이 코드를 생각해?

답변

9

for 루프는 __iter__()을 구현하지 않았기 때문에 특별히 개체를 반복하는 방법을 알지 못하므로 기본 반복기를 사용합니다. 이것은 색인 0에서 시작하여 색인 3을 요청하여 IndexError이 될 때까지갑니다. http://effbot.org/zone/python-for-statement.htm을 참조하십시오.

그런데 list에서 파생되면 구현이 훨씬 간단 해집니다. __init__(), pop() 또는 __getitem__()이 필요하지 않으며 pushappend의 또 다른 이름 일 수 있습니다. 또한 list은 완벽하게 좋은 __iter()__ 메서드를 가지고 있으므로 for은 목록의 끝을 지나지 않고 반복하는 방법을 알고 있습니다.

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

실제로 내 원래 코드에는 업데이트가 있습니다. 그것은 동일합니다. –

+0

예, 세부 사항이 잘못되었습니다. '__len __()'이 아닌'__iter __()'이됩니다. 이제 그걸 고치고있어. – kindall

+0

우수. 이보다 더 좋은 방법을 def _iter __ (self)보다 구현하려면 : for i for self.items : yield i –