从 graph_tool 包中继承 Graph

Subclassing Graph from the graph_tool package

我正在尝试从 graph_tool 包中子 class Graph 以在 Python 中进行一些图形分析(以便我可以生成一些我自己的函数,但仍然使用 Graph_Tool 的函数),而且我似乎无法使用 graph_tool 的图形生成器方法。

我首先导入我的 classes:

import graph_tool.all as gt
import numpy.random as np
np.seed(42)

我试过各种版本的__init__方法:

  1. 从头开始构建图表。这行得通,但我不想这样做 使用这个,因为 graph_tool 有一些很好的方法来预填充 你的图表(见下面的 2. 和 3.)。

    class myGraph(gt.Graph):
        def __init__(self): 
            super(myGraph, self).__init__()
            self.add_vertex(4)
    
  2. 使用 graph_tool 图形生成器方法。这会在函数内部生成一个 gt.Graph 对象。但是当我尝试在函数外打印对象时,出现错误。

    class myGraph(gt.Graph):
        def __init__(self):
            self = gt.collection.data['celegansneural']
            print self
    g = myGraph()
    print g
    

上面的代码returns(注意第一行是我的`init方法中print self的结果):

     <Graph object, directed, with 297 vertices and 2359 edges at 0x1049d2a50> 
     Traceback (most recent call last): <br>
     File "Graph_Tool.py", line 54, in <module> <br>
        print g <br>
      File "/usr/local/lib/python2.7/site-packages/graph_tool/&#95;_init__.py", line 1683, in &#95;_repr__ <br>
        d = "directed" if self.is_directed() else "undirected" <br>
     File "/usr/local/lib/python2.7/site-packages/graph_tool/&#95;_init__.py", line 2412, in is_directed <br>
        return self.__graph.get_directed() <br>
    AttributeError: 'myGraph' object has no attribute '_Graph__graph'
  1. 我的另一种方法是调用父对象的 __init__,然后用新数据覆盖该对象。当我这样做时,只要我留在我的 __init__ 方法中,一切看起来都很好,但一旦我离开它,我的图表就会被擦除。

    class myGraph(gt.Graph):
        def __init__(self):
            super(myGraph, self).__init__()         
            self = gt.collection.data['celegansneural']
            print self
    g = myGraph()
    print g
    

其中returns以下。注意第一个 print self returns 一个填充的 Graph 对象,而第二个 print g returns 一个空的 myGraph 对象

<Graph object, directed, with 297 vertices and 2359 edges at 0x11df610d0>
<myGraph object, directed, with 0 vertices and 0 edges at 0x109d14190>

如果这是 graph_tool 库的一些挑剔问题,我提前道歉,但我认为这更有可能是我的编码错误而不是他们的。

你通常应该更喜欢组合而不是继承——除非你想自定义图形的行为class本身,你不需要子classgt.Graph,就当自己的一员吧class。然后,您可以将自己的方法添加到 class,并在需要时使用图表的方法:

class MyGraph(object):
    def __init__(self, graph):
        self.graph = graph

    def do_stuff(self):
        # do stuff with self.graph

# Usage:
my_graph = MyGraph(graph=gt.collection.whatever())
my_graph.do_stuff()

您似乎对 python 中赋值的工作方式有点困惑。但我想实现你想要的正确方法是用适当的参数调用父级的构造函数:

class myGraph(gt.Graph):
    def __init__(self):
        super(myGraph, self).__init__(gt.collection.data['celegansneural'])
g = myGraph()
print(g)