首先先简单介绍一下这几个内建函数:函数
__getitem__:根据传入的int参数,返回一个列表中的元素对象
__iter__:返回一个可迭代对象接口
__next__:当被迭代时,返回下一个迭代的对象get
查了点资料,来源:知乎 连接:https://www.zhihu.com/question/44015086/answer/119281039 做者:灵剑it
这是个和多态有关的问题,Python中关于迭代有两个概念,第一个是Iterable,第二个是Iterator,协议规定Iterable的__iter__方法会返回一个Iterator, Iterator的__next__方法(Python 2里是next)会返回下一个迭代对象,若是迭代结束则抛出StopIteration异常。
同时,Iterator本身也是一种Iterable,因此也须要实现Iterable的接口,也就是__iter__,这样在for当中二者均可以使用。
个人理解是,若是这个对象被for时,会首先调用__iter__方法返回一个iterator,而后再对这个iterator循环调用__next__方法,直到碰到StopIteration时则中止退出
若是for的对象没有__iter__方法,则没法得到一个迭代器,那么就会报错,可是,若是这个类实现了__getitem__方法,会从0开始依次读取相应的下标,直到发生IndexError为止,str类就没有实现了_iter_方法,因此咱们能够for一个str对象,让它的每个字母都打印输出,接下来附一个经典的FIB类增长理解:
class Fib(object):
def __init__(self):
self.a = 0
self.b = 1
def next(self):
self.a , self.b = self.b , self.a + self.b
if self.b > 1000:
raise StopIteration return self.a def __iter__(self): return self