2012-03-20 19 views
8

soy python novato, y la variable miembro de clase funciona raro en mi código python. algunos funcionan como variables normales, pero algunos funcionan como variables estáticas.variable miembro python de instancia funciona como variable miembro, y algunos funciona como variable estática

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) 

resultado

0==== 
value : default 

===== 

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

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

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

pero el último resultado de la prueba es diferente de lo que esperaba en la última prueba. No debe haber "A" en el 'valor_de_lista' de la instancia de 'b'. Se acaba de crear, y nunca se ha agregado 'A' antes. Agregué 'A' a la instancia de 'a', no 'b'. Pero el resultado me muestra que también hay 'A' en 'b' Además, el 'list_value' y el 'valor' en la clase funcionan de manera diferente. Parece que ambos tienen la misma sintaxis. ¿Por qué funcionan de manera diferente?

+4

posible duplicado de [¿Por qué se recuerda el atributo de clase?] (Http://stackoverflow.com/questions/9713259/why-class-attribute-is-remembered) –

Respuesta

17

Esas son, de hecho, variables de clase. Para crear las variables de instancia, inicializarlas en la función __init__:

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

La razón value se está comportando como variables de instancia se debe a que se está configurando usando self.value. Cuando Python ve self.X, busca si hay una propiedad X en su objeto, y si no hay ninguna, mira su clase. Como nunca configuró self.list_value, está accediendo a la variable de clase, que se comparte entre todas las instancias, por lo que cualquier modificación se reflejará en cualquier otro objeto.

3

La diferencia clave es que se está agregando al list_value, y está asignando a value. Se llaman "variables de clase". Cada instancia tiene su propia referencia a la variable de clase, por lo que la lista se comparte. Sin embargo, cuando asigna, está cambiando la referencia de esa instancia para apuntar a una variable diferente, lo que explica el comportamiento de value.

Si está buscando un comportamiento de variable de instancia desde list_value, inícielo en el constructor (un método de clase llamado __init__).

Cuestiones relacionadas