[Python][迭代器和生成器]委托迭代

委托迭代的概念和意图

当我们不满足于默认的可迭代对象时(列表和字典的行为需要做定制化时),我们需要创建一个新的可迭代对象,这个对象可以依据已有可迭代对象建立,例如本例当中,我们在列表的基础上增加其他特性以满足需求

实验代码

类的定义

这个案例当中,创建了一个Node类,它的行为根基是列表,因此__iter__(): 方法担当一个连接者的角色,使Node有了列表的特质。换句话说,在这个例子中,iter()方法只是简单地将迭代请求转发给对象内部持有的_children属性上。

实例化过程

值得注意的是,我们创建的所有实例都拥有Node的特性,因此可以多层次化地嵌套使用,尤其是其中的__repr__属性,这是本案例中最能体现定制化列表优势的点。在创建好祖孙三代节点之后,通过add_child功能,构建一个家谱图如下图所示

root
child1
child2
grandchild1
grandchild2
grandchild3
grandchild4
class Node:
    def __init__(self,value):#初始化,包括定义一个可迭代对象,和用于实验的数值
        self._value = value
        self._children = []

    def __repr__(self):#该函数负责在print时回显
        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)#下面实例化祖孙三代的node节点
    child1 = Node(1)
    child2 = Node(2)
    grandchild1 = Node(11) 
    grandchild2 = Node(22)
    grandchild3 = Node(33) 
    grandchild4 = Node(44)
    
    child1.add_child(grandchild1)#层层建立关系,形成家谱图
    child1.add_child(grandchild2)
    child2.add_child(grandchild3)
    child2.add_child(grandchild4)
    root.add_child(child1)#将实例化后的child1这个node 添加到root这个node中
    root.add_child(child2)#将实例化后的child2这个node 添加到root这个node中
    
    for ch in root:
    	print(ch)
    	for gch in ch:
        	print(gch)

实验结果

打印内容如预期

Node(1)  #child1节点
Node(11) #child1的孙子1
Node(22) #child1的孙子2
Node(2)  #child2节点
Node(33) #child2的孙子1
Node(44) #child2的孙子2

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/qq_33868661/article/details/114172002