2017-02-20 1 views
1

Je tente de sous-classer Graph à partir du package graph_tool pour une analyse graphique en Python (afin de générer certaines de mes propres fonctions, tout en utilisant les fonctions de Graph_Tool), et je ne semble pas utiliser les méthodes du générateur de graphes graph_tool.Graphique de sous-classes du package graph_tool

Je commence par importer mes cours:

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

J'ai essayé différentes versions de la méthode __init__:

  1. Construire un graphique à partir de zéro. Cela fonctionne, mais je préférerais ne pas l'utiliser, parce que graph_tool a quelques bonnes façons de pré-remplir vos graphiques (voir 2. et 3. ci-dessous).

    class myGraph(gt.Graph): 
        def __init__(self): 
         super(myGraph, self).__init__() 
         self.add_vertex(4) 
    
  2. utilisation des méthodes de génération de graphique graph_tool. Cela génère un objet gt.Graph à l'intérieur de la fonction. Mais quand j'essaie d'imprimer l'objet en dehors de la fonction, j'obtiens une erreur.

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

Les retours de code ci-dessus (notez la première ligne est le résultat de print self dans mon `méthode init):

 <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. Mon autre approche consiste à appeler le parent __init__ mais à remplacer l'objet par de nouvelles données. Quand je fais cela, tout va bien tant que je reste dans ma méthode __init__, mais une fois que je le quitte, mon graphique est effacé.

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

qui renvoie les éléments suivants. Notez les premiers print self renvoie une population Graph objet, tandis que le second print g retourne un vide myGraph objet

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

je présenter des excuses à l'avance si cela est un problème difficile de graph_tool, bibliothèque, mais je me suis dit qu'il est plus probable mon erreur de codage que la leur.

+1

Attribution de 'self' ne change pas vraiment votre objet en aucune façon. 'self' est une variable locale ordinaire, et l'affectation de variable ne mute jamais des objets comme ça. Voir http://nedbatchelder.com/text/names.html – user2357112

+0

Merci. Cela a du sens pourquoi 3. ne fonctionne pas. Je suis en train de réaffecter la variable locale "self" dans la méthode à l'objet, mais comme __init__ ne retourne pas "self", je n'ai pas vraiment modifié l'objet renvoyé par la méthode. – Tim

Répondre

0

Vous semblez un peu confus sur la façon dont fonctionne l'affectation en python. Mais je suppose que la bonne façon d'obtenir ce que vous voulez est d'appeler les constructeurs du parent avec les arguments appropriés:

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

C'est parfait! Je n'ai pas remarqué que 'Graph .__ init__' accepte un objet graphique pour l'initialiser. En passant dans 'gt.collection.data ['celegansneural']' au constructeur des parents dans 'myGraph' init, nous obtenons l'effet de créer un' myGraph' que _is_ _a_ 'Graph', et est pré-rempli avec l'un des les méthodes intégrées de génération de graphe de graph-tool. Je vous remercie! – Tim

-1

Vous devriez généralement préférer la composition sur l'héritage - à moins que vous voulez personnaliser le comportement de la classe elle-même graphique , vous n'avez pas besoin de sous-classe gt.Graph, ont un seul en tant que membre de votre propre classe. Ensuite, vous pouvez ajouter vos propres méthodes à votre classe, et utiliser les méthodes du graphique lorsque vous devez:

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

Est-ce que le downvoter se souciait d'expliquer? – tzaman

+0

Je ne suis pas l'électeur descendant, mais j'ai décoché "répondre" pour le changer en Tiago puisque sa réponse atteint l'intention réelle de l'héritage. Je comprends ce que vous dites sur la composition, mais dans ce cas, 'myGraph' _is_ _a_' Graph' (pas 'myGraph' _has_ _a_' Graph') donc la composition ne correspond pas exactement. Encore merci pour votre réponse. – Tim