[Python] Domanda stupida sulla dichiarazione delle variabili in una classe
Daniele Varrazzo
piro a develer.com
Mar 10 Apr 2012 17:57:21 CEST
On Tue, 10 Apr 2012 16:32:57 +0200, Karim Gorjux wrote:
> Qual é la differenza tra la variabile my_var e le varibili istanza?
Se limiti my_var ad essere un oggetto non modificabile, come una
stringa o un numero, apparentemente non c'è differenza
(apparentemente!).
Ma se my_var è un oggetto modificabile, la differenza è più immediata:
class C1:
my_list = []
def __init__(self):
pass
class C2:
def __init__(self):
self.my_list = []
Tutte le istanze di C1 accedono alla stessa lista:
In [2]: c11 = C1(); c12 = C1()
In [3]: c11.my_list.append('ciao')
In [4]: c12.my_list
Out[4]: ['ciao']
Ogni istanza di C2 invece ha la sua lista, isolata da quella delle
altre istanze.
In [13]: c21 = C2(); c22 = C2()
In [14]: c21.my_list.append('ciao')
In [15]: c22.my_list
Out[15]: []
Tipicamente vuoi avere lo stato di ogni istanza isolato, quindi scegli
la seconda forma. Occasionalmente può servire che tutte le istanze
accedano allo stesso oggetto, nel qual caso puoi usare la prima forma,
ma questo è più raro. Nella prima forma, "my_list" non è altro che una
variabile globale, solo che anziché vivere nel namespace del modulo vive
dentro una classe.
Nota anche che se C1.my_list non è modificabile sul posto, è comunque
sostituibile, e questo ovviamente si ripercuote su tutte le istanze (per
valori di "ovviamente" che man mano che giochi con classi e istanze ti
diventano più chiari).
In [16]: c11.my_list
Out[16]: ['ciao']
In [17]: C1.my_list = {"tutt'": 'altro'}
In [18]: c11.my_list
Out[18]: {"tutt'": 'altro'}
In [19]: c12.my_list
Out[19]: {"tutt'": 'altro'}
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
Maggiori informazioni sulla lista
Python