[Python] variabili globali e d'istanza: provengo da java

Francesco Guerrieri f.guerrieri a gmail.com
Mer 26 Dic 2007 12:27:56 CET


ciao:)

On Dec 26, 2007 11:47 AM, ugaciaka <ugaciaka a gmail.com> wrote:
> Riassumendo: ho scritto un programmino (senza nessuna classe ma con
> sole funzioni), ho notato che se passo da paramentro una variabile per
> fargli capire al compilatore che non è una variabili d'istanza (cioé
> della funzione) ma di tutto del corpo del programma devo anteporre
> global al nome della variabile passata.

Quasi, in realtà se il nome che usi non è all'interno dello scope in
cui ti trovi (per esempio non è definito nel corpo della funzione)
viene cercato negli scope via via più esterni.
Dalla documentazione:
"he global statement is a declaration which holds for the entire
current code block. It means that the listed identifiers are to be
interpreted as globals. It would be impossible to assign to a global
variable without global, although free variables may refer to globals
without being declared global."

Questo vuol dire che se tu ASSEGNI ad una variabile globale (quindi è
il membro sinistro di un assegnamento) devi dichiararla global,
altrimenti non serve.
Quindi
a = [1]

def f(b):
    a.append(b) # Funziona, il nome a viene trovato nello scope esterno

def g(b):
    a = b # questo nome "a" non è il nome globale, è un nome interno
allo scope di g

def h(b):
    global a
    a = b # questo invece cambia il nome globale.


In genere è meglio evitare di usare variabili global... e per fortuna
spesso ci si riesce e si ottiene un codice più pythonico :)

>
> Ok fin qua ci sono. Ma se io volessi ora mettere tutto in una classe
> come agisco? Dove definisco le variabili globali? Nella classe?
> All'interno del costruttore?...

Il costruttore ( __init__ ) è una funzione che viene chiamata
quando istanzi la classe ma non
ha, a parte questo, uno status particolare. Le variabili le puoi definire come
attributi dell'istanza

def Prova(object):
    def __init__(self, a):
        self.my_var = a
    def a_little_method(self):
        print "my_var is ", self.my_var



> #COSA INVECE VORREI FARE
> #io vorrei invece fare solo, dopo aver creato la classe che ingloba i
> miei metodi:
> #oggetto=Classe(carattere_da_sostituire, carattere_sostituito)
> #oggetto.rinomina_file()


class Classe(object):
    def __init__(self, from, to):
        self.from = from
        self.to = to
     def rinomina_file(self, filelist):
        for name in filelist:
            print name.replace(self.from, self.to)

Spero di essere stato abbastanza chiaro.

ciao,
Fra


More information about the Python mailing list