Networkx / Python: utilizzare una classe per un nodo è una pratica migliore rispetto alla definizione di più attributi?

3

Ho letto il tutorial e la documentazione di NetworkX, ma non sono riuscito a trovare risposte reali a questa domanda.

Normalmente quando utilizzo NetworkX, potrei usare le stringhe per definire i nodi, quindi impostare diversi attributi.

per es.

G = nx.Graph()
G.add_node('John Doe', haircolor = 'brown')
G.node['John Doe'][age] = 22

Tuttavia, sembra che dichiarare una classe con i membri anziché gli attributi sia meglio nella pratica, specialmente quando ci sono molti attributi e la leggibilità potrebbe essere un problema.

class Person:
     name = None
     age = None

Person p
p.name = 'John Doe'
p.age = 22
G.add_node(p)

Qualcuno potrebbe essere così gentile da convalidare il mio ragionamento? Mi manca la lungimiranza di vedere se gli attributi nodo / bordo di Networkx sarebbero preferibili.

    
posta wnewport 22.02.2012 - 00:11
fonte

1 risposta

11

Questo non risponde alla tua domanda. Però. Sembra necessario.

class Person:
     name = None
     age = None

Non fa quello che stai suggerendo.

Questi sono due attributi di livello di classe. Sono enfaticamente non variabili d'istanza.

Anche. Non si "dichiarano" attributi. Non li dichiari in quel modo.

Person p non è il vero Python.

p= Person()
p.name = 'John Doe'
p.age = 22

Questo enfaticamente non imposta gli attributi del livello di classe creati come parte della classe. Crea ulteriori attributi a livello di istanza.

Questo potrebbe rispondere alla tua domanda.

Networkx ti consente di avere qualsiasi oggetto associato a un nodo.

Sentiti libero di farlo

class Person( object ):
    def __init__( self, name, age ):
        self.name= name
        self.age= age

G.add_node('John Doe', data = Person( name='John Doe', age=22 ) )

Ora hai tutti i dati del tuo nodo in un singolo oggetto associato all'attributo "data".

Per banali tipi di valore nome-valore, questo ovviamente non sta creando alcun valore reale.

Tuttavia, se si dispone di un metodo specifico del nodo (raro in problemi di grafi, ma possibile), si avranno le funzioni di metodo associate a un nodo.

Nei problemi di teoria dei grafi, molti degli algoritmi funzionano sul grafico - nel suo complesso - e raramente troverai un uso per una classe con le funzioni di metodo.

Dato che la modifica è una banale sintassi, è probabilmente più semplice iniziare con

    G.add_node('John Doe', age=22 )

E passa a

    G.add_node('John Doe', data = Person( name='John Doe', age=22 ) )

quando è assolutamente necessario.

    
risposta data 22.02.2012 - 00:38
fonte

Leggi altre domande sui tag