En Python, intento ejecutar un método en una clase y aparece un error:
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
¿Qué significa este error? Que esta causando este error?
fibo = f.fibo()
Necesita instanciar la clase entre paréntesis.fibo().f()
Respuestas:
OK, antes que nada, no tiene que obtener una referencia al módulo con un nombre diferente; ya tienes una referencia (del
import
) y puedes usarla. Si quieres un nombre diferente solo usaimport swineflu as f
.En segundo lugar, está obteniendo una referencia a la clase en lugar de crear una instancia de la clase.
Entonces esto debería ser:
Un método enlazado es uno que está adjunto a una instancia de un objeto. Un método independiente es, por supuesto, uno que no está asociado a una instancia. El error generalmente significa que está llamando al método en la clase en lugar de en una instancia, que es exactamente lo que estaba sucediendo en este caso porque no había instanciado la clase.
fuente
swineflu.fibo().f()
si solo lo llama una vez.Cómo reproducir este error con la menor cantidad de líneas posible:
Falla debido a TypeError porque no instanciaste la clase primero, tienes dos opciones: 1: hacer que el método sea estático para que puedas ejecutarlo de forma estática, o 2: instanciar tu clase para que tengas una instancia para tomar en, para ejecutar el método.
Parece que desea ejecutar el método de forma estática, haga esto:
O bien, lo que probablemente quiso decir es usar la instancia instanciada de esta manera:
Si esto te confunde, haz estas preguntas:
fuente
fibo = f.fibo
hace referencia a la clase misma. Probablemente queríafibo = f.fibo()
(tenga en cuenta los paréntesis) hacer una instancia de la clase, después de lo cualfibo.f()
debería tener éxito correctamente.f.fibo.f()
falla porque esencialmente está llamandof(self, a=0)
sin suministrarself
;self
se "vincula" automáticamente cuando tiene una instancia de la clase.fuente
f
es un método (instancia) Sin embargo, lo está llamando a través defibo.f
, dondefibo
está el objeto de clase. Por lo tanto,f
no está vinculado (no está vinculado a ninguna instancia de clase).Si lo hiciste
entonces eso
f
está vinculado (a la instanciaa
).fuente
Aquí hay un buen tutorial para comenzar con las clases en Python.
fuente
En Python 2 (3 tiene una sintaxis diferente):
¿Qué sucede si no puede crear una instancia de su clase Parent antes de que necesite llamar a uno de sus métodos?
Se usa
super(ChildClass, self).method()
para acceder a los métodos principales.fuente
Diferencias en las versiones de Python 2 y 3:
Si ya tiene un método predeterminado en una clase con el mismo nombre y vuelve a declararlo con el mismo nombre, aparecerá como una llamada a método no vinculado de esa instancia de clase cuando desee instanciarlo.
Si quería métodos de clase, pero los declaró como métodos de instancia en su lugar.
Un método de instancia es un método que se utiliza cuando se crea una instancia de la clase.
Un ejemplo sería
Método de etiqueta de clase:
En las versiones de python 2 y 3 difieren la clase @classmethod para escribir en python 3, lo obtiene automáticamente como un método de etiqueta de clase y no necesita escribir @classmethod. Creo que esto podría ayudarlo.
fuente
Prueba esto. Para python 2.7.12 necesitamos definir un constructor o agregar uno mismo a cada método seguido de definir una instancia de una clase llamada objeto.
fuente