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)
# 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__() 方法å�ªæ˜¯ç®€å�•的将è¿ä»£è¯·æ±‚ä¼ é€’ç»™å†…éƒ¨çš„ _children 属性。
讨论¶
Pythonçš„è¿ä»£å™¨å��议需è¦� __iter__() 方法返回一个实现了 __next__() 方法的è¿ä»£å™¨å¯¹è±¡ã€‚
å¦‚æžœä½ å�ªæ˜¯è¿ä»£é��åŽ†å…¶ä»–å®¹å™¨çš„å†…å®¹ï¼Œä½ æ— é¡»æ‹…å¿ƒåº•å±‚æ˜¯æ€Žæ ·å®žçŽ°çš„ã€‚ä½ æ‰€è¦�å�šçš„å�ªæ˜¯ä¼ 递è¿ä»£è¯·æ±‚æ—¢å�¯ã€‚
这里的 iter() 函数的使用简化了代ç �,
iter(s) å�ªæ˜¯ç®€å�•的通过调用 s.__iter__() 方法æ�¥è¿”回对应的è¿ä»£å™¨å¯¹è±¡ï¼Œ
就跟 len(s) 会调用 s.__len__() 原ç�†æ˜¯ä¸€æ ·çš„。