[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