programacion poo polimorfismo otra orientada objetos metodo llamar instancia importar clases clase python class global-variables instance-variables member

poo - programacion orientada a objetos python pdf



¿Las variables de clase se comparten en todas las instancias en Python? (4)

Esta pregunta ya tiene una respuesta aquí:

Comencé a codificar en Python hace una semana, es mi error que comencé a codificar usando Oops, clases y objetos que pronto. Asumí que mi dominio de C ++ será de ayuda ... Recibí el código siguiente

class A: var=0 list=[] def __init__(self): pass

Aquí, para mi sorpresa, var y list son una variable global, se comparte en todos los casos que parece ... Lo que pensé fue que fue diferente en todos los casos ... Me tomó medio día descubrirlo eso ... No tiene el más mínimo sentido, que solo se puede acceder a una variable mediante un objeto de clase, pero se comparte en todas las instancias ....... Curioso, ¿hay una razón detrás de esto? ??


Estas son básicamente como variables estáticas en Java:

// Example equivalent Java class A { static int var = 0; static String[] list; }

Este es el comportamiento deseado: las variables de clase son para la clase .

Para variables de instancia normales, declararlas en el constructor:

class A: def __init__(self): self.var = 0 self.list = []

Es posible que desee ver variables de clase estáticas en Python .


La razón es que en la class Python es una instrucción ejecutable que se ejecuta como cualquier otra. El cuerpo de la definición de clase se ejecuta una vez, cuando se define la clase. Si tiene una línea de línea var = [] allí, entonces solo se ejecuta una vez, por lo que solo se puede crear una lista como resultado de esa línea.


Tenga en cuenta que no ve este comportamiento para var , solo lo ve para la list :

>>> class A: ... var = 0 ... list = [] ... >>> a1 = A() >>> a2 = A() >>> a1.var = 3 >>> a2.var 0


definitivamente no se debe compartir var , siempre que acceda a ella con instance.var o self.var . Sin embargo, con la lista, lo que hace su declaración es cuando la clase se evalúa, se crea una instancia de la lista y se vincula al dictado de la clase, por lo tanto, todas las instancias tendrán la misma lista. Siempre que establezca instance.list = somethingelse resp. self.list = somethingelse , debería obtener un valor de nivel de instancia.

Ejemplo de tiempo:

>>> class A(): ... var = 0 ... list = [] ... >>> a = A() >>> b = A() >>> a.var 0 >>> a.list [] >>> b.var 0 >>> b.list [] >>> a.var = 1 >>> b.var 0 >>> a.list.append(''hello'') >>> b.list [''hello''] >>> b.list = [''newlist''] >>> a.list [''hello''] >>> b.list [''newlist'']