Se eu tiver o seguinte código python:
class Foo(object):
bar = 1
def bah(self):
print(bar)
f = Foo()
f.bah()
Reclama
NameError: global name 'bar' is not defined
Como posso acessar classe / variável estática bar
no método bah
?
python
oop
static-variables
Ross Rogers
fonte
fonte
Respostas:
Em vez de
bar
usarself.bar
ouFoo.bar
. Atribuir aFoo.bar
criará uma variável estática e atribuir aself.bar
criará uma variável de instância.fonte
Defina o método da classe:
Agora, se
bah()
tiver que ser um método de instância (ou seja, ter acesso a si mesmo), você ainda poderá acessar diretamente a variável de classe.fonte
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:
{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:
mas:
{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.
fonte
fonte
fonte