2011-06-25 9 views
22

¿Cuál es la forma correcta de definir una variable global que tenga un alcance de clase en python?Clases de Python de variable global

Viniendo de un fondo de C/C++/Java Asumo que esto es correcto:

class Shape: 
    lolwut = None 

    def __init__(self, default=0): 
     self.lolwut = default; 
    def a(self): 
     print self.lolwut 
    def b(self): 
     self.a() 
+4

Si la respuesta a continuación es correcta, debe aceptarla como tal – Clintm

Respuesta

53

Lo que tenemos es correcta, aunque no se llamaría global, es un atributo de clase y se puede acceder a través de la clase, por ejemplo, Shape.lolwut o a través de una instancia, por ejemplo shape.lolwut pero tenga cuidado al establecer que, ya que establece un nivel de instancia no atribuyen atributo de clase

class Shape(object): 
    lolwut = 1 

shape = Shape() 

print Shape.lolwut, 
print shape.lolwut, 

# setting shape.lolwut would not change class attribute lolwut 
# but will create it in the instance 
shape.lolwut = 2 

print Shape.lolwut, 
print shape.lolwut, 

# to change class attribute access it via class 
Shape.lolwut = 3 

print Shape.lolwut, 
print shape.lolwut 

de salida:

1 1 1 2 3 2 

Alguien puede esperar salida sea 1 1 2 2 3 3 pero sería incorrecto

+1

Pongo a prueba su ejemplo en Python 2.7, todo está bien. Pero cuando establece valores por primera vez en Shape.lolwut, el valor de la instancia cambiará. Una vez que establezca el valor en el atributo de la instancia, los dos no serán los mismos, incluso si cambia el valor del nivel de clase, como su ejemplo. – x4snowman

+0

@Danyun también lo probé. Vi la misma situación que mencionaste. ¿Sabes por qué sucede así? Cuando haya cambiado el atributo del nivel de clase, también cambiará el de la instancia. Pero cuando cambias el nivel de instancia al principio, luego cambias de nivel de Clase, no volverá a afectar la instancia. – user1167910

+0

@ user1167910 Consulte la documentación de python https://docs.python.org/2.7/reference/datamodel.html, encontrará 'Asignaciones y eliminaciones de atributos actualizando el diccionario de la instancia, nunca el diccionario de una clase' – x4snowman