2011-03-22 2 views
0

J'ai une classe comme ceinitialisation des données attributs

class SomeClass: 
    def doSomething(self): 
     self.counter = 50 

Je crée une instance x pour SomeClass

x = SomeClass() 

Lorsque je tente d'obtenir la valeur du compteur comme ceci: x.counter je reçois le erreur suivante -

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: SomeClass instance has no attribute 'counter' 

Mais après avoir appelé la fonction de membre x.doSomething() puis recherchez l'attribut de données, il est disponible.

>>> x.doSomething() 
>>> x.counter 
50 

Pourquoi est-ce comme ça? Tous les attributs de données ne seront-ils pas disponibles dès la création de l'instance?

Merci.

Répondre

7

Non, self.counter est créé uniquement puis doSomething() est appelée. En Python, les attributs d'instance sont dynamiques et peuvent être créés lors de l'exécution. Pour avoir self.counter disponible à partir de la création de l'objet, mettre son initialisation dans un constructeur:

class SomeClass: 
    def __init__(self): 
     self.counter = None 
    def doSomething(self): 
     self.counter = 50 

Maintenant, toutes les instances de SomeClass seront disponibles ont self.counter du début, bien que sa valeur sera None jusqu'à ce que doSomething est appelé. En principe, il existe de nombreuses variantes sur ce thème pour vous permettre d'implémenter la sémantique exacte qui vous intéresse.

+0

Merci. Est-ce une pratique recommandée de suivre cela? Ou devrions-nous initialiser tous les attributs de données dans '__init__'? – bdhar

+0

On dirait que vous avez modifié la réponse à laquelle répond ma question dans mon commentaire précédent. Merci. – bdhar

+1

@bdhar: A moins que vous ne fassiez quelque chose d'extra-funky, je recommanderais que tous vos attributs d'instance soient initialisés dans le constructeur. –

Questions connexes