如何在Python中基于不同参数用工厂模式创建网络图生成类
修正后的网络拓扑模拟工厂类代码
原代码存在多处语法和逻辑错误,以下是具体问题修正及完整可用代码:
原代码问题汇总
- 所有子类的
__init__方法缺失第一个必选参数self,违反Python类实例方法的基本规则 - Erdos_Renyi和Watts_Strogatz类的
__init__存在笔误,错误将self.p赋值为n,应为传入的p参数 - Network_Simulation_Class中判断参数存在性时,误用变量名(如
k而非'k'),且未从kwargs字典正确提取参数值 - 创建Watts_Strogatz实例时参数顺序错误,不符合其构造方法定义
- 未处理参数缺失的异常场景
修正后的完整代码
import networkx as nx class Erdos_Renyi(object): def __init__(self, n, p): self.n = n self.p = p # 修正笔误:原代码将self.p赋值为n def simulate_graph(self): return nx.erdos_renyi_graph(self.n, self.p) class Watts_Strogatz(object): def __init__(self, n, k, p): self.n = n self.k = k self.p = p # 修正笔误:原代码将self.p赋值为n def simulate_graph(self): return nx.watts_strogatz_graph(self.n, self.k, self.p) class Barabasi_Albert(object): def __init__(self, n, m): self.n = n self.m = m def simulate_graph(self): return nx.barabasi_albert_graph(self.n, self.m) class Network_Simulation_Class: def __init__(self, n, **kwargs): self.n = n self.graph_builder = None # 根据参数匹配对应的拓扑生成器 if 'k' in kwargs and 'p' in kwargs: self.graph_builder = Watts_Strogatz(n, kwargs['k'], kwargs['p']) elif 'm' in kwargs: self.graph_builder = Barabasi_Albert(n, kwargs['m']) elif 'p' in kwargs: self.graph_builder = Erdos_Renyi(n, kwargs['p']) else: raise ValueError("参数不完整:Erdos-Renyi需传入p,Watts-Strogatz需传入k和p,Barabasi-Albert需传入m") def get_graph(self): # 返回networkx的Graph实例 if self.graph_builder: return self.graph_builder.simulate_graph() return None
使用示例
# 创建Watts-Strogatz拓扑 sim = Network_Simulation_Class(1000, k=3, p=0.1) ws_graph = sim.get_graph() print(type(ws_graph)) # 输出 <class 'networkx.classes.graph.Graph'> # 创建Erdos-Renyi拓扑 er_sim = Network_Simulation_Class(500, p=0.02) er_graph = er_sim.get_graph() # 创建Barabasi-Albert拓扑 ba_sim = Network_Simulation_Class(800, m=2) ba_graph = ba_sim.get_graph()
内容的提问来源于stack exchange,提问作者Yehui He
相关产品推荐
相关产品推荐

