2008-08-30 26 views
30

Si creo una clase A de la siguiente manera:¿Por qué mi variable de instancia no está en __dict__?

class A: 
    def __init__(self): 
     self.name = 'A' 

Inspección del miembro de __dict__ parece {'name': 'A'}

Sin embargo, si se crea una clase B:

class B: 
    name = 'B' 

__dict__ está vacía.

¿Cuál es la diferencia entre los dos, y por qué no name aparece en B 's ?

Respuesta

42

B.name es un atributo de clase, no un atributo de instancia. Se muestra en B.__dict__, pero no en b = B(); b.__dict__.

La distinción queda algo oscurecida porque cuando accede a un atributo en una instancia, el dict de clase es un repliegue. Por lo tanto, en el ejemplo anterior, b.name le dará el valor de B.name.

11
class A: 
    def _ _init_ _(self): 
     self.name = 'A' 
a = A() 

Crea un atributo en la instancia de objeto de una de tipo A y por lo tanto se pueden encontrar en: a.__dict__

class B: 
    name = 'B' 
b = B() 

Crea un atributo de la clase B y el atributo se pueden encontrar en B.__dict__ alternativamente si tiene una instancia b de tipo B, puede ver los atributos de nivel de clase en b.__class__.__dict__

Cuestiones relacionadas