2011-12-31 29 views
6

No es este código:atributo de clase de dos instancias de la misma clase

class Sample: 
    variable = 2 
object1 = Sample() 
object2 = Sample() 
print object1.variable # 2 
print object2.variable # 2 
object1.variable = 1 
print object1.variable # 1 
print object2.variable # 2 <- why not 1 too? 

Por qué object2.variable no es también 1 después de la asignación a la variable de clase?

+3

posible duplicado de [pitón atributo de clase] (http://stackoverflow.com/questions/2923579/python-class-attribute) –

+0

Para mi entendimiento im pedir esto sólo: ¿Cuál fue el pensamiento detrás de la pregunta? ¿No es obvio que object1 y object2 son instancias distintas de la misma clase? –

+1

Creo que él cree que 'variable' es estático porque está definido fuera de una función, o algo así. No estoy seguro de verdad :) Todavía es una pregunta razonable de alguna manera. – hochl

Respuesta

4

No confunda esto con una variable estática. En su caso, ambos objetos tienen un nombre variable apuntan a un objeto 2 después de la creación de instancias. Ahora bien, si cambia la variable a 1 en un objeto, todo lo que debe hacer es vincular el name a un objeto diferente, es decir, el objeto 1. El nombre en object2 todavía se refiere a un objeto 2. El objeto de clase original no ha sido tocado y aún tiene el nombre variable apuntando a 2, por lo que object3 = Sample() tendrá un 2 vinculado a variable también.

Una forma de evitar esto es para escribir la clase como la siguiente:

>>> class Sample: 
...  variable=[2] 
... 
>>> object1 = Sample() 
>>> object2 = Sample() 
>>> print object1.variable[0]; print object2.variable[0] 
2 
2 
>>> object1.variable[0]=1 
>>> print object1.variable[0]; print object2.variable[0] 
1 
1 

Esto se debe a que todas las clases se unen el nombre variable a la misma, muatable objeto, y manipular el contenido de este mismo objeto (variable[0]).

1

Dos instancias de una misma clase no comparten la misma memoria y las mismas variables. Por ejemplo, puede tener un Car cuyo color es red y otro cuyo color es blue.

1

Has respondido la pregunta en el título. Son dos instancias separadas de la misma clase. object1 y object2 son objetos diferentes y, por lo tanto, cualquier cosa que le ocurra a uno de estos objetos no alterará a la otra.

+0

que no es del todo cierto (aunque válido para asignaciones simples de atributos). Tan pronto como tenga estructuras de datos mutables, las instancias estarán conectadas. –

1

Porque object1 es un objeto diferente de object2. Para hacer que sean los mismos, que tiene que hacer

class Sample: 
    variable = 2 
object1 = Sample() 
object2 = object1 
print object1.variable 
print object2.variable 
object1.variable = 1 
print object1.variable 
print object2.variable 

Nota la línea que dice

object2 = object1 
1

Esta es tal vez contradictorio, pero cuando se escribe

object1.variable = 1 

No eres asignando a la variable de clase, pero definiendo una variable de instancia del mismo nombre. (Puede inspeccionar object1 's __dict__ para verificar esto). Tenga en cuenta que si se escribe

Sample.variable 

o

object1.__class__.variable 

Usted obtendrá 2 en ambos casos, ya que nunca lo cambiaron variable realidad. Para asignarlo, puede consultarlo como se indica arriba - object1.__class__.variable = 1, por ejemplo, lo hace de manera que object2.variable == 1 también.

+0

Tenemos fragmentos de código casi iguales en nuestras respuestas :) – ikostia

2

Echa un vistazo a este question.

En pocas palabras, la clase y la instancia de clase tienen diferentes espacios de nombres (En realidad, esto no es muy correcta, porque ejemplo de espacio de nombres coloca un poco en la parte superior de la clase espacio de nombres para que en caso si tiene un atributo de clase y un atributo de instancia con el mismo nombre, se accederá a la instancia 'a través de inst.attr, de otra manera - clase'). Por lo tanto, cuando se hace

object1.variable = 1 

no cambia realmente variable de clase (que a menudo se llama campo estático en otros idiomas), que acaba de enlaza un nuevo campo llamadovariable a la instancia de la clase object1.

Lo que probablemente quiera hacer es cambiar la variable de clase, no la instancia uno. Se podría hacer de esta manera:

Sample.variable = 1 

o como esto:

object1.__class__.variable = 1 
4

Debido a que asigne la nueva variable de instancia en instancia, no variable de clase. Si puede cambiar el atributo de clase, debe establecer la variable a través del atributo __class__. (O directamente al objeto de clase.)

class Sample: 
    variable = 2 
object1 = Sample() 
object2 = Sample() 
print object1.variable # 2 
print object2.variable # 2 
object1.__class__.variable = 1 # or Sample.variable = 1 
print object1.variable # 1 
print object2.variable # 1 
Cuestiones relacionadas