继承networkx subgraph方法触发TypeError,如何修复?
修复NetworkX子类调用subgraph时的构造参数错误
当自定义继承nx.DiGraph的MyNetwork类时,如果构造函数包含必填参数,调用subgraph方法会抛出TypeError——因为父类的subgraph方法会尝试直接实例化MyNetwork,但不会传入你的自定义必填参数。
修复方案
以下是几种可行的解决方式:
1. 重写subgraph方法(推荐,保持子类类型)
在MyNetwork类中重写subgraph方法,手动传入必填参数,同时保留子图的属性:
class MyNetwork(nx.DiGraph): def __init__(self, some_parameter: str, **attr): super().__init__(**attr) self.some_parameter = some_parameter def subgraph(self, nodes): # 调用父类方法获取子图结构 parent_subgraph = super().subgraph(nodes) # 用当前实例的参数创建MyNetwork子图,继承原属性 return MyNetwork(self.some_parameter, **parent_subgraph.graph)
这样调用network.subgraph([2,3])时,会生成正确的MyNetwork实例,同时保留子图的节点、边及图属性。
2. 给必填参数设置默认值(适合允许默认值的场景)
如果业务逻辑允许some_parameter有默认值,可以修改构造函数,让参数非必填:
class MyNetwork(nx.DiGraph): def __init__(self, some_parameter: str = "default_param", **attr): super().__init__(**attr) self.some_parameter = some_parameter
这种方式不需要修改subgraph调用,但要注意默认值是否符合业务需求。
3. 使用NetworkX的全局subgraph函数(不保留子类类型)
如果不需要子图是MyNetwork类型,可以直接调用全局的nx.subgraph函数,返回原生的nx.DiGraph实例:
sub_network = nx.subgraph(network, [2,3])
内容的提问来源于stack exchange,提问作者Joris Kinable
相关产品推荐
相关产品推荐

