2012-01-03 14 views
6

Los diccionarios y listas definidos directamente bajo la definición de clase actúan como estáticos (por ejemplo, this question)
¿Por qué otras variables, como el entero, no?¿Por qué algunas variables de clase parecen actuar como estáticas mientras que otras no?

>>> class Foo(): 
     bar=1 

>>> a=Foo() 
>>> b=Foo() 
>>> a.bar=4 
>>> b.bar 
1 
>>> class Foo(): 
     bar={} 

>>> a=Foo() 
>>> b=Foo() 
>>> a.bar[7]=8 
>>> b.bar 
{7: 8} 
+0

cheque respuesta de todo género [aquí] (http://stackoverflow.com/questions/8701500/python-class-instance-variables-and-class-variables/8701647#8701647) – joaquin

+0

posible duplicado de http://stackoverflow.com/questions/68645/static-class-variables-in-python – gecco

Respuesta

15

Son todas las variables de clase. Excepto cuando asignó a.bar=4 creando una variable de instancia. Básicamente Python tiene un orden de búsqueda en los atributos. Se va:

instance -> class -> parent classes in MRO order (left to right) 

Así que si usted tiene

class Foo(object): 
    bar = 1 

Esta es una variable en la clase Foo. Una vez hecho

a = Foo() 
a.bar = 2 

que haya creado una nueva variable en el objeto con el nombre abar. Si mira a.__class__.bar, aún verá 1, pero está efectivamente oculto debido al orden mencionado anteriormente.

El dict que ha creado está en el nivel de clase, por lo que se comparte entre todas las instancias de esa clase.

6

Al realizar la asignación

>>> a.bar=4 

que son reencuadernación el nombre Foo.bar-4, que es una nueva instancia de un número entero. Por otro lado,

>>> a.bar[7]=8 

no volver a enlazar Foo.bar a algo diferente, y simplemente modifica el diccionario que el nombre se refiere a.

Si lo hace

>>> a.bar = {7: 8} 

entonces usted va a volver a enlazar Foo.bar a un nuevo diccionario .

1

Suponiendo a es una instancia de A y A tiene un atributo de clase bar:

  • a.bar = 4 crea una instancia de atributos bar que oculta la clase bar en el contexto de a

  • a.bar[4] = 2 sólo modifica el objeto al que se vincula el nivel de clase bar (suponiendo que admite la indexación)

  • a.bar += 1 - Esta es desagradable. Si el nivel de clase bar admite la operación += (por ejemplo, implementando __iadd__()), entonces se modifica in situ y no se crea ningún atributo de nivel de objeto. De lo contrario, es equivalente a a.bar = a.bar + 1 y se crea un nuevo atributo de instancia bar.

Cuestiones relacionadas