Como em todos os bons exemplos, você simplificou o que realmente está tentando fazer. Isso é bom, mas vale a pena notar que o python tem muita flexibilidade quando se trata de variáveis de classe versus instância. O mesmo pode ser dito dos métodos. Para uma boa lista de possibilidades, recomendo ler a introdução das novas aulas de Michael Fötsch , especialmente as seções 2 a 6.
Uma coisa que exige muito trabalho para se lembrar ao iniciar é que python não é java. Mais do que apenas um clichê. Em java, uma classe inteira é compilada, tornando a resolução do espaço para nome realmente simples: quaisquer variáveis declaradas fora de um método (em qualquer lugar) são variáveis de instância (ou, se estáticas, de classe) e são implicitamente acessíveis nos métodos.
No python, a regra geral é que existem três namespaces pesquisados, em ordem, por variáveis:
- A função / método
- O módulo atual
- Builtins
{begin pedagogy}
Existem exceções limitadas a isso. O principal que me ocorre é que, quando uma definição de classe está sendo carregada, a definição de classe é seu próprio espaço para nome implícito. Mas isso dura apenas enquanto o módulo estiver sendo carregado e é totalmente ignorado quando dentro de um método. Portanto:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
mas:
>>> 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}
No final, a única coisa a lembrar é que você não tem acesso a qualquer uma das variáveis que você deseja acesso, mas provavelmente não implicitamente. Se seus objetivos são simples e diretos, optar por Foo.bar ou self.bar provavelmente será suficiente. Se o seu exemplo está ficando mais complicado, ou você deseja fazer coisas sofisticadas, como herança (você pode herdar métodos estáticos / de classe!), Ou a idéia de se referir ao nome da sua classe dentro da própria classe parece errada para você, confira a introdução que eu vinculei.