No Python, estou tentando executar um método em uma classe e recebo um erro:
Traceback (most recent call last):
File "C:\Users\domenico\Desktop\py\main.py", line 8, in <module>
fibo.f()
TypeError: unbound method f() must be called with fibo instance
as first argument (got nothing instead)
Código: (swineflu.py)
class fibo:
a=0
b=0
def f(self,a=0):
print fibo.b+a
b=a;
return self(a+1)
Script main.py
import swineflu
f = swineflu
fibo = f.fibo
fibo.f() #TypeError is thrown here
O que esse erro significa? O que está causando esse erro?
fibo = f.fibo()
Precisa instanciar a classe entre colchetes.fibo().f()
Respostas:
OK, primeiro de tudo, você não precisa obter uma referência para o módulo em um nome diferente; você já tem uma referência (da
import
) e pode apenas usá-la. Se você quiser um nome diferente, basta usarimport swineflu as f
.Segundo, você está recebendo uma referência à classe em vez de instanciar a classe.
Portanto, isso deve ser:
Um método acoplado é aquele anexado a uma instância de um objeto. Um método não vinculado é, obviamente, aquele que não está anexado a uma instância. O erro geralmente significa que você está chamando o método na classe e não em uma instância, que é exatamente o que estava acontecendo neste caso, porque você não havia instanciado a classe.
fonte
swineflu.fibo().f()
se estiver ligando apenas uma vez.Como reproduzir este erro com o menor número possível de linhas:
Ele falha por causa de TypeError, porque você não instancia a classe primeiro, você tem duas opções: 1: tornar o método estático para que você possa executá-lo de maneira estática ou 2: instanciar sua classe para que você tenha uma instância a capturar para, para executar o método
Parece que você deseja executar o método de maneira estática, faça o seguinte:
Ou, o que você provavelmente quis dizer é usar a instância instanciada assim:
Se isso o confunde, faça estas perguntas:
fonte
fibo = f.fibo
referencia a própria classe. Você provavelmente desejoufibo = f.fibo()
(observe os parênteses) criar uma instância da classe, após a qualfibo.f()
deve ter sucesso corretamente.f.fibo.f()
falha porque você está essencialmente ligandof(self, a=0)
sem fornecerself
;self
é "vinculado" automaticamente quando você tem uma instância da classe.fonte
f
é um método (instância). No entanto, você está chamando-o viafibo.f
, ondefibo
está o objeto de classe. Portanto,f
é ilimitado (não vinculado a nenhuma instância de classe).Se você fez
então isso
f
está vinculado (à instânciaa
).fonte
Aqui está um bom tutorial para começar as aulas em Python.
fonte
No Python 2 (3 tem sintaxe diferente):
E se você não conseguir instanciar sua classe Parent antes de precisar chamar um de seus métodos?
Use
super(ChildClass, self).method()
para acessar os métodos pai.fonte
Diferenças nas versões python 2 e 3:
Se você já possui um método padrão em uma classe com o mesmo nome e o declara novamente, ele aparecerá como uma chamada de método não acoplado dessa instância de classe quando você a instanciar.
Se você queria métodos de classe, mas os declarou como métodos de instância.
Um método de instância é um método usado quando criar uma instância da classe.
Um exemplo seria
Método do rótulo da classe:
Nas versões python 2 e 3 diferem a classe @classmethod para escrever no python 3, obtém-o automaticamente como um método de rótulo de classe e não precisa escrever @classmethod. Acho que isso pode ajudá-lo.
fonte
Tente isso. Para python 2.7.12, precisamos definir o construtor ou adicionar self a cada método, seguindo a definição de uma instância de uma classe chamada object.
fonte