4.4 实现迭代器协议

    目前为止,在一个对象上实现迭代最简单的方式是使用一个生成器函数。在4.2小节中,使用Node类来表示树形数据结构。你可能想实现一个以深度优先方式遍历树形节点的生成器。下面是代码示例:

    Python的迭代协议要求一个 iter() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 方法并通过 StopIteration 异常标识迭代的完成。但是,实现这些通常会比较繁琐。下面我们演示下这种方式,如何使用一个关联迭代器类重新实现 方法:

    1. class Node2:
    2. def __init__(self, value):
    3. self._value = value
    4. self._children = []
    5.  
    6. def __repr__(self):
    7. return 'Node({!r})'.format(self._value)
    8.  
    9. def add_child(self, node):
    10. self._children.append(node)
    11.  
    12. def __iter__(self):
    13. return iter(self._children)
    14. def depth_first(self):
    15. return DepthFirstIterator(self)
    16.  
    17.  
    18. class DepthFirstIterator(object):
    19. '''
    20. Depth-first traversal
    21. '''
    22.  
    23. def __init__(self, start_node):
    24. self._node = start_node
    25. self._children_iter = None
    26. self._child_iter = None
    27.  
    28. def __iter__(self):
    29. return self
    30. def __next__(self):
    31. # Return myself if just started; create an iterator for children
    32. if self._children_iter is None:
    33. self._children_iter = iter(self._node)
    34. return self._node
    35. # If processing a child, return its next item
    36. elif self._child_iter:
    37. try:
    38. nextchild = next(self._child_iter)
    39. return nextchild
    40. except StopIteration:
    41. self._child_iter = None
    42. return next(self)
    43. # Advance to the next child and start its iteration
    44. else:
    45. self._child_iter = next(self._children_iter).depth_first()

    原文: