He estado tratando de entender el manejo de Python de las variables de clase y de instancia. En particular, encontré this answer bastante útil. Básicamente dice que si declaras una variable de clase y luego haces una asignación a [instance].property
, estarás asignando a una variable completamente diferente, una en un espacio de nombre diferente de la variable de clase.Asignación compuesta a la clase Python y variables de instancia
Así entonces considerado - si quiero todas las instancias de mi clase para tener un miembro con algún valor por defecto (decir cero), debería hacerlo de esta manera:
class Foo:
num = 0
o así?
class Foo:
def __init__(self):
self.num = 0
Sobre la base de lo que había leído antes, pensaría que el segundo ejemplo sería la inicialización de la variable 'derecho' (la instancia en lugar de la variable de clase). Sin embargo, creo que el primer método funciona perfectamente también:
class Foo:
num = 0
bar = Foo()
bar.num += 1 # good, no error here, meaning that bar has an attribute 'num'
bar.num
>>> 1
Foo.num
>>> 0 # yet the class variable is not modified! so what 'num' did I add to just now?
Así que ... ¿por qué funciona esto? ¿Qué no estoy recibiendo? FWIW, mi conocimiento previo de OOP proviene de C++, por lo que la explicación por analogía (o señalando dónde se descompone) podría ser útil.
Y cuando digo clase/instancia 'variable', lo que realmente quiero decir es' atributo'. – MattH