1. 程式人生 > 其它 >4.2代理迭代

4.2代理迭代

問題:

​ 你構建了一個自定義容器物件,裡面包含有列表、元組或其他可迭代物件。你想直接在你的這個新容器物件上執行迭代操作。

解決方案:

​ 實際上你只需要定義一個__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__()原理是一樣的。