4.2 代理迭代

2018-02-24 15:26 更新

問(wèn)題

你構(gòu)建了一個(gè)自定義容器對(duì)象,里面包含有列表、元組或其他可迭代對(duì)象。你想直接在你的這個(gè)新容器對(duì)象上執(zhí)行迭代操作。

解決方案

實(shí)際上你只需要定義一個(gè) __iter__() 方法,將迭代操作代理到容器內(nèi)部的對(duì)象上去。比如:

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)

# Example
if __name__ == '__main__':
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    # Outputs Node(1), Node(2)
    for ch in root:
        print(ch)

在上面代碼中,__iter__() 方法只是簡(jiǎn)單的將迭代請(qǐng)求傳遞給內(nèi)部的 _children 屬性。

討論

Python的迭代器協(xié)議需要 __iter__() 方法返回一個(gè)實(shí)現(xiàn)了 __next__() 方法的迭代器對(duì)象。如果你只是迭代遍歷其他容器的內(nèi)容,你無(wú)須擔(dān)心底層是怎樣實(shí)現(xiàn)的。你所要做的只是傳遞迭代請(qǐng)求既可。

這里的 iter() 函數(shù)的使用簡(jiǎn)化了代碼,iter(s) 只是簡(jiǎn)單的通過(guò)調(diào)用 s.__iter__() 方法來(lái)返回對(duì)應(yīng)的迭代器對(duì)象,就跟 len(s) 會(huì)調(diào)用 s.__len__() 原理是一樣的。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)