迭代器模式(Iterator)用于依序遍歷访问集合对象的每一元素,但不暴露集合對象的内部结构,只允許让外部來访问集合内部的数据,在實作上通常會抽象出一个迭代器类並含有hasNext()及 next()之接口定义,再由其繼承具体子類負責集合对象的遍历行为之功能。
示例:
from abc import ABCMeta, abstractmethod
class Iterator(object): #迭代器抽象基類
__metaclass__ = ABCMeta
@abstractmethod
def hasNext(self):
pass
@abstractmethod
def next(self):
pass
class ConcreteIterator(Iterator): #具体子類
def __init__(self, alist): #傳入list型式之alist參數
self.alist = alist
def hasNext(self):
'''判別是否还有下一个元素'''
return self.alist != [] #直接回傳條件式判斷之bool值
def next(self):
'''返回下一个元素'''
return self.alist.pop(0) #移除列表中指定索引之元素---移除指定索引時會將該元素傳回,故可知目前值為何(*但會破壞原list之存值)
class Aggregate(object): #一般抽象基類
def iterator(self):
pass
class ConcreteAggregate(Aggregate): #一般具体子類
def __init__(self, alist):
self.alist = alist
def iterator(self):
'''返回迭代器对象'''
return ConcreteIterator(self.alist) #把list值傳入ConcreteIterator類中以初始化,故此回傳值便具有迭代器功能
if __name__ == "__main__":
concreteAggregate = ConcreteAggregate([1, 2, 3])
concreteIterator = concreteAggregate.iterator() #此變量已具迭代器功能
while concreteIterator.hasNext():
print concreteIterator.next()
輸出:
1
2
3