一个理解语言“内部运作方式”的问题。代码如下:
class NoIter():
def __init__(self):
self.some = [1, 2, 3, 4, 5]
def __getitem__(self, index):
return self.some[index]
t = NoIter()
for item in t:
print(item)
结论:
1
2
3
4
5
问题:
- 为什么一个对象可以被迭代,即使它不包含
__iter__and__next__? - 为什么
__getitem__在迭代过程中隐式调用它?
从文档(PEP234):
总结:要进行迭代,实现这些神奇方法中的任何一个就足够了。
就其工作原理而言,该方法
__getitem__是在迭代协议(methods__iter__,__next__)之前实现的,并且之前用于使对象可迭代(在Python〜2.2之前)。现在这种方法已经过时了,不建议在实践中使用,但为了向后兼容,它仍然保留在语言中。
@Pavel 已经回答了这个问题,但我将添加更多有关其工作原理的信息。
如果你的类只有一个方法
__getitem__,那么 Python 将调用它,并传递从 0 开始到它出现的位置结束的索引IndexError。示范: