迭代器模式,英文为Iterator模式,是我们经常常用但是又最容易忽略的模式,例如,Python中我们访问列表中的数据,通常是按照如下方式访问的: L = [1 , 2, 3, 4, 5] for number in L: print number
这便是迭代器模式,它提供了一种方法能够顺序访问集合(这里表示示例L)中的所有元素,而又不暴露集合内部的实现方式。
其实迭代器的本质是实现了一种方式,能够判断集合中是否还有未被访问的元素,以及提供访问这个元素的方式。通常迭代器是定义如下: from abc import abstractmethod
class Iterator(object):
def __init__(self): pass
@abstractmethod def hasNext(self): pass
@abstractmethod def next(self): pass
即实现了两个方法,是否还有未被访问的元素和下一个未被访问的元素。
举个通俗的例子,一个书架上摆满了书,我们需要查找某本书时,就用到了迭代器模式。我们需要能够查找所有的书,在不知道书架如何摆放书的情况下。这里,我们将书定义为如下: class Book:
def __init__(self, name, number): self.name = name self.number = number
包含两个属性,名称和编号。
同时,我们将书架定义如下: class BookShelf:
def __init__(self): self.books = []
def appendBook(self, book): self.books.append(book)
def getBookAt(self, index): return self.books[index]
def getLength(self): return self.books.__len__()
书嫁实现了增加书目,查找index位置的数目以及总共的图书数目这几个方法。
接下来就是最重要的,也就是Iterator的具体实现: class BookShelfIterator(Iterator):
def __init__(self, bookShelf): self.bookShelf = bookShelf self.index = 0
def hasNext(self): if self.index <> return True else: return False
def next(self): book = self.bookShelf.getBookAt(self.index) self.index = self.index + 1 return book
这里,通过bookShelf的相关方法,来实现了Iterator中的hasNext和next方法。因此,main函数在调用的时候,只需要调用这两个方法,便可以访问书架中的所有的数目,从而屏蔽了书架中展示数目的方式。
main函数的实现如下: if __name__ == '__main__': bookShelf = BookShelf() bookShelf.appendBook(Book('穷查理宝典',1)) bookShelf.appendBook(Book('证券分析', 2)) bookShelf.appendBook(Book('经济学原理', 3))
bookShelfIterator = BookShelfIterator(bookShelf)
while(bookShelfIterator.hasNext()): book = bookShelfIterator.next() print book.name, book.number
这里假设有三本书。这样,通过hasNext方法和next方法便可以访问数目的具体信息。
最后,总结一下迭代器模式:
提供了一种方法能够顺序访问集合中的所有元素
这种方法不暴露集合内部的实现方式
参考:
(完)
看完本文有收获?请转发分享给更多人 关注「Python那些事」,做全栈开发工程师
|