从graph_tool包中对图表进行子类化

时间:2017-02-20 19:48:59

标签: python inheritance subclass graph-tool

我试图从Graph包中对graph_tool进行子类化,以便在Python中进行一些图形分析(这样我就可以生成一些自己的函数,但仍然使用Graph_Tool函数同样),我似乎无法使用graph_tool的图形生成器方法。

我首先导入我的课程:

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
    
  3. 上面的代码返回(注意第一行是我的` 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
      
    2. 返回以下内容。请注意,第一个print self会返回已填充的Graph对象,而第二个print g会返回一个空的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库的一些挑剔问题,我提前道歉,但我认为它更可能是我的编码错误而不是他们的。

2 个答案:

答案 0 :(得分:0)

你似乎对如何在python中进行赋值感到困惑。但是我认为实现你想要的正确方法是用适当的参数调用父代的构造函数:

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

答案 1 :(得分:-1)

您通常应该更喜欢组合而不是继承 - 除非您想要自定义图表类本身的行为,否则您不需要子类gt.Graph,只需要一个作为你自己班级的一员。然后,您可以将自己的方法添加到您的班级,并在需要时使用图表的方法:

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()