[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