You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:52:44