2010-07-05 11 views
12

yo soy relativamente nuevo en Python y estaba esperando que alguien podría explicar lo siguiente para mí:propiedades estáticas en Python

class MyClass: 
    Property1 = 1 
    Property2 = 2 

print MyClass.Property1 # 1 
mc = MyClass() 
print mc.Property1 # 1 

qué puedo acceder Propiedad1 tanto estática como a través de una instancia de MyClass?

+3

Porque así es como funcionan las variables de clase? – SilentGhost

+1

@SilentGhost: Sí, las variables de clase de Python funcionan de esta manera, pero este comportamiento no es necesario y no puedo encontrar una explicación para él. – Philipp

Respuesta

27

El código

class MyClass: 
    Property1 = 1 

crea una clase MyClass que tiene un diccionario:

>>> MyClass.__dict__ 
{'Property1': 1, '__doc__': None, '__module__': '__main__'} 

Aviso el par clave-valor 'Property1': 1. Cuando dice MyClass.Property1, Python busca en la dict Property1 y si la encuentra, devuelve el valor asociado 1.

>>> MyClass.Property1 
1 

Cuando se crea una instancia de la clase,

>>> mc = MyClass() 

un diccionario para la instancia también se crea:

>>> mc.__dict__ 
{} 

Aviso este dict está vacía. Cuando dice mc.Property1, Python primero se ve en mc.__dict__ para la clave 'Property1'. Como no lo encuentra allí, se ve en el dic de la clase mc, es decir, MyClass.__dict__.

>>> mc.Property1 
1 

Tenga en cuenta que hay mucho más en la historia de Python attribute access. (No he mencionado las reglas importantes relativas a los descriptores, por ejemplo). Pero lo anterior le indica la regla para los casos más comunes de acceso a los atributos.

+0

+1 para una descripción detallada del mecanismo, pero esta también es una oportunidad perfecta para declarar explícitamente una propiedad fundamental de Python: casi todo es o actúa como un objeto, incluidas las definiciones de clases. –

+0

Gracias, eso tiene más sentido. – Andre

+0

"se ve en el dicto de la clase padre de' mc' "debería decir" se ve en el dictado de la clase 'mc'", ¿no? – EoghanM

Cuestiones relacionadas