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
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a