Je voudrais ajouter quelque chose aux réponses que j'ai lues dans ce fil de discussion et ce fil de discussion (qui fait référence à celui-ci).
Avertissement : ces remarques proviennent des expériences que j'ai menées
Variables à l'extérieur de __init__
:
Il s'agit en fait de variables de classe statiques et sont, par conséquent, accessibles à toutes les instances de la classe.
Variables à l'intérieur de __init__
:
La valeur de ces variables d'instance est uniquement accessible à l'instance en cours (via la référence self
)
Ma contribution:
Une chose que les programmeurs doivent prendre en compte lors de l'utilisation de variables de classe statiques est qu'elles peuvent être masquées par des variables d'instance (si vous accédez aux variables de classe statiques via la référence self
).
Explication:
Auparavant, je pensais que les deux façons de déclarer les variables étaient exactement les mêmes (sotte que je suis), en partie parce que je pouvais accéder aux deux types de variables via la référence self
. C'est maintenant, lorsque j'ai rencontré des problèmes, que j'ai fait des recherches sur le sujet et l'ai clarifié.
Le problème d'accéder aux variables de classe statiques via la référence self
est que cela ne fait référence à la variable de classe statique que s'il n'y a pas de variable d'instance avec le même nom, et pour aggraver les choses, essayer de redéfinir une variable de classe statique via la référence self
ne fonctionne pas car une variable d'instance est créée qui masque ensuite la variable de classe statique précédemment accessible.
Pour contourner ce problème, vous devriez toujours faire référence aux variables de classe statiques via le nom de la classe.
Exemple:
#!/usr/bin/env python
class Foo:
static_var = 'chaque instance a accès'
def __init__(self,name):
self.instance_var = 'Je suis %s' % name
def printAll(self):
print 'self.instance_var = %s' % self.instance_var
print 'self.static_var = %s' % self.static_var
print 'Foo.static_var = %s' % Foo.static_var
f1 = Foo('f1')
f1.printAll()
f1.static_var = 'Masquer static_var'
f1.printAll()
f2 = Foo('f2')
f2.printAll()
Foo.static_var = 'classe modifiée'
f1.printAll()
f2.printAll()
Sortie:
self.instance_var = Je suis f1
self.static_var = chaque instance a accès
Foo.static_var = chaque instance a accès
self.instance_var = Je suis f1
self.static_var = Masquer static_var
Foo.static_var = chaque instance a accès
self.instance_var = Je suis f2
self.static_var = chaque instance a accès
Foo.static_var = chaque instance a accès
self.instance_var = Je suis f1
self.static_var = Masquer static_var
Foo.static_var = classe modifiée
self.instance_var = Je suis f2
self.static_var = classe modifiée
Foo.static_var = classe modifiée
J'espère que cela sera utile à quelqu'un
1 votes
Une réponse détaillée avec des exemples dans la question dupliquée : stackoverflow.com/a/9056994/911945