如何在base_graph基类中调用子类以修改图数据集?
图数据集节点增删的实现方案
针对你的需求,我们可以通过组合模式让base_graph类调用节点增删工具类的方法,核心思路是让修改类直接操作base_graph的实例状态,同时在基类中控制操作的触发逻辑。以下是调整后的代码实现:
调整后的完整代码
from torch.utils.data import Dataset # 假设你基于PyTorch Dataset实现 import random class base_graph(Dataset): def __init__(self, nodes, edges): self.nodes = set(nodes) # 用集合存储节点,提升增删查询效率 self.edges = set(edges) # 用集合存储边,自动去重 def random_graph(self): # 生成随机图示例逻辑:重置为随机节点和边 self.nodes = set(random.sample(range(10), 5)) self.edges = set() for node in self.nodes: neighbor = random.choice(list(self.nodes - {node})) self.edges.add((node, neighbor)) def __len__(self): return len(self.nodes) def __repr__(self): return f"base_graph(nodes={sorted(self.nodes)}, edges={sorted(self.edges)})" def __getitem__(self, idx): # 随机选择执行添加/删除操作(可根据需求改为固定顺序或其他逻辑) operation = "add" if not self.nodes else random.choice(["add", "delete"]) if operation == "add": new_node = max(self.nodes) + 1 if self.nodes else 0 add_modifier = Modifygraph_byAdding(new_node) add_modifier.add_sample_to_A(self) else: del_node = random.choice(list(self.nodes)) del_modifier = Modifygraph_byDeleting(del_node) del_modifier.delete_node_from_A(self) # 返回处理后的节点和边(可根据需求调整返回格式) return sorted(self.nodes), sorted(self.edges) class Modifygraph_byAdding: def __init__(self, node): self.node_to_add = node def add_sample_to_A(self, graph): # 修改传入的graph实例的节点集合 if self.node_to_add not in graph.nodes: graph.nodes.add(self.node_to_add) # 可选:自动为新节点添加一条随机边(按需调整) if len(graph.nodes) > 1: random_neighbor = random.choice(list(graph.nodes - {self.node_to_add})) graph.edges.add((self.node_to_add, random_neighbor)) class Modifygraph_byDeleting: def __init__(self, node): self.node_to_delete = node def delete_node_from_A(self, graph): # 删除节点及所有关联边 if self.node_to_delete in graph.nodes: graph.nodes.remove(self.node_to_delete) # 过滤掉包含待删除节点的所有边 graph.edges = {edge for edge in graph.edges if self.node_to_delete not in edge}
核心设计思路
- 状态内聚:
base_graph自身维护nodes和edges的状态,用集合存储以提升增删操作效率。 - 组合调用:在
__getitem__方法中,根据需求(示例为随机选择)实例化增删工具类,并将当前base_graph实例传入工具类方法,让工具类直接修改其状态。 - 职责分离:
base_graph专注于数据集核心逻辑(如生成随机图、实现Dataset接口),增删操作由独立工具类负责,符合单一职责原则。
注意事项
- 操作节点时必须同步处理边:删除节点时要移除所有包含该节点的边,避免出现无效边。
- 可按需调整操作触发逻辑:比如固定先执行添加再执行删除,或者根据索引判断操作类型。
- 如果需要更复杂的修改策略,可扩展工具类方法或新增其他操作类。
内容的提问来源于stack exchange,提问作者Ana_1960
相关产品推荐
相关产品推荐

