2013-11-24 17 views
5

Sono relativamente nuovo a pensare a python in termini di programmazione orientata agli oggetti e mi viene relativamente lentamente.Condivisione di variabili globali tra classi in Python

È possibile passare variabili globali tra classi con più funzioni al loro interno? Ho letto molto su di loro qui e in altre fonti, ma sono ancora un po 'confuso.

Il mio obiettivo finale è definire una variabile globalmente, assegnargli un valore in una funzione di una classe e quindi USARLO nella funzione di un'altra classe. È possibile? Sto costruendo un pythonaddin per ArcMap, che richiede una classe per ogni pulsante. Voglio avere un pulsante per assegnare un valore a una variabile, e quindi usare quella variabile in un'altra classe nello script.

(Prima di arrivare alla contraerea, lo so che è relativamente cattiva forma da usare variabili globali, in primo luogo, sto cercando di imparare)

Per esempio, come un esempio molto semplificata:

x = [] 

class A(): 

    def func_1(self): 
     #populate the x variable 
     global x 
     x = 1 


class B(): 

    def func_2(self): 
     global x 
     #do stuff with x 

È accettabile (anche se non pitonico)?

+0

Evita i globali quando puoi. –

+0

È necessario utilizzare la parola chiave globale solo se si intende modificare la variabile in questione. –

risposta

1

Sì, è possibile . Il tuo codice è quasi corretto, manca solo un paio di parentesi nelle definizioni di funzione. Oltre a questo, funziona.

Ora, è accettabile? Nel 99% dei casi, no, non lo è. Esistono molti modi per passare variabili e condividere dati tra classi, e l'uso di variabili globali è uno dei peggiori, se non lo è il peggiore.

+1

Mi chiedevo ... Perché i "globali" sono una cattiva soluzione? Per esempio - ora sto lavorando con il codice, che avrà davvero molte variabili (circa 20), che devono essere usate in molte funzioni e in classi e metodi. Quindi - perché è cattivo - basta impostarli come globali? E - quale soluzione quindi: usa le classi iheritanace (alcune parent ''Main' class con' __init__', che imposteranno le var predefinite per tutte le classi' child 'e i metodi? È la soluzione? PS Nel mio caso - tutte le var saranno 'const ", Voglio dire: wil lsetup quando è stato avviato lo script e non sono stati modificati fino alla fine. – setevoy

2

Sì, può funzionare. Ecco il codice modificato:

x = [] 

class A: 
    def func_1(self): 
     #populate the x variable 
     global x 
     x.append(1) 
class B: 
    def func_2(self): 
     global x 
     print x 

a = A() 
a.func_1() 
b = B() 
b.func_2() 

E 'possibile stampare l'elenco x correttamente. Quando è possibile, dovresti cercare di evitare le variabili globali. Puoi usare molti altri modi per passare variabili tra classi in modo più sicuro ed efficiente.

PS: osservare i parametri nelle funzioni.

+0

OK, suppongo che il mio problema è che mi stavo confondendo nel chiamare la variabile da una classe all'altra. semplici domande ../ – user22861

+0

Oh aspetta, l'ho appena capito, è solo questione di salvare una variabile come self.x e poi chiamare il Bx più tardi.Grazie per la guida! – user22861

+0

Penso che tu possa inizializzare un'altra classe in una sola classe, quindi usa le variabili in un'altra classe usando le sue funzioni. Proprio come 'classe A: def __init __ (self): self.another = B()' –

2

Una soluzione più pitonica sarebbe avere gli oggetti pulsante (nel loro metodo che gestisce l'evento "stampa") impostare un attributo o chiamare un metodo di qualsiasi oggetto abbia bisogno delle informazioni.

+0

Questo è quello che ho cercato di fare, ma mi sono un po 'impantanato quando ho chiamato una variabile da una classe in un modulo in un'altra. Che forma ci vorrebbe? – user22861

+0

@ user22861 Dovresti creare un'istanza della classe di destinazione, ad es. chiamato 'spam' (istanza, non classe) nel suo modulo, ad es. 'Eggs'. Nel modulo che usa i pulsanti si farebbe 'dallo spam di importazione delle uova'. –