Comme pour tous les bons exemples, vous avez simplifié ce que vous essayez de faire. C'est bien, mais il convient de noter que python a beaucoup de flexibilité en ce qui concerne les variables de classe par rapport aux variables d'instance. On peut en dire autant des méthodes. Pour une bonne liste de possibilités, je vous recommande de lire l' introduction aux classes de nouveau style de Michael Fötsch , en particulier les sections 2 à 6.
Une chose qui demande beaucoup de travail à retenir lors de la mise en route est que python n'est pas java. Plus qu'un simple cliché. En java, une classe entière est compilée, rendant la résolution de l'espace de noms très simple: toutes les variables déclarées en dehors d'une méthode (n'importe où) sont des variables d'instance (ou, si statique, de classe) et sont implicitement accessibles dans les méthodes.
Avec python, la grande règle d'or est qu'il y a trois espaces de noms qui sont recherchés, dans l'ordre, pour les variables:
- La fonction / méthode
- Le module actuel
- Builtins
{begin pedagogy}
Il existe des exceptions limitées à cela. Le principal qui me vient à l'esprit est que, lorsqu'une définition de classe est en cours de chargement, la définition de classe est son propre espace de noms implicite. Mais cela ne dure que tant que le module est en cours de chargement, et est entièrement contourné dans une méthode. Donc:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
mais:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
En fin de compte , la chose à retenir est que vous n'avez accès à l' une des variables que vous souhaitez accéder, mais probablement pas implicitement. Si vos objectifs sont simples et directs, opter pour Foo.bar ou self.bar sera probablement suffisant. Si votre exemple devient plus compliqué, ou si vous voulez faire des choses fantaisistes comme l'héritage (vous pouvez hériter de méthodes statiques / de classe!), Ou que l'idée de faire référence au nom de votre classe dans la classe elle-même vous semble erronée, consultez l'intro que j'ai liée.