Python中的for语句用起来很爽,但是要求 in后面的对象iterable,python中的很多对象支持,如list, tuple, dict。
如果要让自己的类对象也iterable怎么办,究竟如何才算iterable object呢?其实,自已也可以定义特殊的方法来使自定义类支持这种操作。
第一种方法很简单,就是实现一个特殊函数__getitem__
第二种方法,也是实现一个特殊函数__iter__,此函数要求返回一个iterator对象,对于iterator对象的要求就是实现特殊函数 __next__,所以一般的做法就是类同时实现__iter__和__next__,然后在__iter__中返回自己。__next__函数要求依次 返回需要迭代的项目,结束后raise StopIteration,说着很乱,直接上代码,更清晰:
class MyIterator(): def __init__(self,*items): self._items=list(items); self._index=-1; def __next__(self): self._index+=1; if self._index <len(self._items): return self._items[self._index]; else: raise StopIteration; def __iter__(self): self._index=-1; return self;
第二种方法应该是推荐的做法,不过python的版本不同,要求也不同,在python 3中必须是__next__,否则就报TypeError,在python2.6版本则必须实现next()方法; 为了兼容的话,可以同时定义一个next()方法:
def next(self): return self.__next__();