4.2代理迭代
阿新 • • 發佈:2022-03-17
問題:
你構建了一個自定義容器物件,裡面包含有列表、元組或其他可迭代物件。你想直接在你的這個新容器物件上執行迭代操作。
解決方案:
實際上你只需要定義一個__iter__()
方法,將迭代操作代理到容器內部的物件上去,比如:
class Node: def __init__(self,value): self._value=value self._children=[] def __repr__(self): return 'Node ({!r})'.format(self._value) def add_child(self,node): self._children.append(node) def __iter__(self): return iter(self._children) if __name__=='__main__': root=Node(0) child1=Node(1) child2=Node(2) root.add_child(child1) root.add_child(child2) for ch in root: print(ch)
在上面程式碼中,__item__()
方法只是簡單的將迭代請求傳遞給內部的_children
屬性。
討論:
python的迭代器協議需要__iter__()
方法返回一個實現了__next__()
方法的迭代器物件。如果你只是迭代遍歷其他容器的內容,就跟len(s)會呼叫s.__len__()
原理是一樣的。