[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