2008-08-30 7 views
30

Si je crée une classe A comme suit:Pourquoi ma variable d'instance n'est-elle pas dans __dict__?

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

le membre __dict__ Inspecter ressemble {'name': 'A'}

Si toutefois je crée une classe B:

class B: 
    name = 'B' 

__dict__ est vide.

Quelle est la différence entre les deux, et pourquoi ne pas name apparaître dans B__dict__?

Répondre

42

B.name est un attribut de classe, pas un attribut d'instance. Il apparaît dans B.__dict__, mais pas dans b = B(); b.__dict__.

La distinction est quelque peu obscurcie parce que lorsque vous accédez à un attribut sur une instance, la classe dict est un repli. Donc, dans l'exemple ci-dessus, b.name vous donnera la valeur de B.name.

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

Crée un attribut sur l'instance d'objet a de type A et il peut donc être trouvée dans: a.__dict__

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

Crée un attribut de la classe B et l'attribut peut être trouvé dans B.__dict__ alternativement Si vous avez une instance b de type B, vous pouvez voir les attributs de niveau de classe dans b.__class__.__dict__

Questions connexes