2012-03-20 22 views
8

sono newbie python e la variabile membro di classe funziona in modo strano nel mio codice python. alcuni funzionano come una variabile normale, ma alcuni funzionano come variabili statiche!la variabile membro python di istanza funziona come variabile membro e alcuni funzionano come variabile statica

class Chaos: 
    list_value = [] 
    value = "default" 

    def set_value(self, word): 
     self.list_value.append(word) 
     self.value = word 

    def show(self, num): 
     print(str(num) + "====") 
     print("value : " + self.value) 
     for st in self.list_value: 
      sys.stdout.write(st) 
     print("\n=====\n") 

a = Chaos() 
a.show(0) 
a.set_value("A") 
a.show(1) 
b = Chaos() 
a.show(2) 
b.show(3) 

risultato

0==== 
value : default 

===== 

1==== 
value : A 
A 
===== 

2==== 
value : A 
A 
===== 

3==== 
value : default 
A 
===== 

ma l'ultimo risultato del test è diverso da quello che mi aspettavo in ultimo test. Non dovrebbe esserci "A" nel "list_value" dell'istanza di "b". E 'stato appena creato, e non è mai stato aggiunto' A 'prima. Ho aggiunto "A" all'istanza di "a", non "b". Ma il risultato mi mostra che ci sono anche 'A' in 'b' Inoltre, il 'list_value' e il 'valore' nella classe funziona in modo diverso. Sembra che entrambi abbiano la stessa sintassi. perché lavorano in modo diverso?

+4

possibile duplicato di [Perché l'attributo di classe è stato ricordato?] (Http://stackoverflow.com/questions/9713259/why-class-attribute-is-remembered) –

risposta

17

Queste sono, in effetti, variabili di classe. Per creare variabili di istanza, li inizializzare nella funzione __init__:

class Chaos: 
    def __init__(self): 
     self.list_value = [] 
     self.value = "default" 

La ragione value si sta comportando come variabili di istanza è perché si sta impostando utilizzando self.value. Quando Python vede self.X, guarda se c'è una proprietà X nel tuo oggetto, e se non ce n'è, guarda alla sua classe. Dal momento che non hai mai impostato self.list_value, accede alla variabile di classe, che è condivisa tra tutte le istanze, quindi qualsiasi modifica si rifletterà su ogni altro oggetto.

3

La differenza principale è che si sta aggiungendo a list_value e che si sta assegnando a value. Sono chiamati "variabili di classe". Ogni istanza ha il proprio riferimento alla variabile di classe, motivo per cui l'elenco è condiviso. Tuttavia, quando si assegna, si modifica il riferimento di quell'istanza in modo che punti a una variabile diversa, il che spiega il comportamento di value.

Se si sta cercando il comportamento delle variabili di esempio da list_value, inizializzarlo nel costruttore (un metodo di classe chiamato __init__).

Problemi correlati