Al llamar a un método de clase se genera un TypeError en Python

No entiendo cómo se usan las clases. El siguiente código me da un error cuando bash usar la clase.

class MyStuff: def average(a, b, c): # Get the average of three numbers result = a + b + c result = result / 3 return result # Now use the function `average` from the `MyStuff` class print(MyStuff.average(9, 18, 27)) 

Error:

 File "class.py", line 7, in  print(MyStuff.average(9, 18, 27)) TypeError: unbound method average() must be called with MyStuff instance as first argument (got int instance instead) 

Que pasa

Related of "Al llamar a un método de clase se genera un TypeError en Python"

Puede crear una instancia de la clase declarando una variable y llamando a la clase como si fuera una función:

 x = mystuff() print x.average(9,18,27) 

Sin embargo, esto no funcionará con el código que nos dio. Cuando llama a un método de clase en un objeto dado (x), siempre pasa un puntero al objeto como primer parámetro cuando llama a la función. Entonces, si ejecuta su código en este momento, verá este mensaje de error:

 TypeError: average() takes exactly 3 arguments (4 given) 

Para solucionar este problema, deberá modificar la definición del método promedio para tomar cuatro parámetros. El primer parámetro es una referencia de objeto, y los 3 parámetros restantes serían para los 3 números.

Por su ejemplo, me parece que desea utilizar un método estático.

 class mystuff: @staticmethod def average(a,b,c): #get the average of three numbers result=a+b+c result=result/3 return result print mystuff.average(9,18,27) 

Tenga en cuenta que un uso intensivo de métodos estáticos en Python suele ser un síntoma de mal olor: si realmente necesita funciones, debe declararlas directamente en el nivel del módulo.

Para modificar de forma mínima su ejemplo, puede modificar el código para:

 class myclass(object): def __init__(self): # this method creates the class object. pass def average(self,a,b,c): #get the average of three numbers result=a+b+c result=result/3 return result mystuff=myclass() # by default the __init__ method is then called. print mystuff.average(a,b,c) 

O para expandirlo más completamente, permitiéndole agregar otros métodos.

 class myclass(object): def __init__(self,a,b,c): self.a=a self.b=b self.c=c def average(self): #get the average of three numbers result=self.a+self.b+self.c result=result/3 return result a=9 b=18 c=27 mystuff=myclass(a, b, c) print mystuff.average() 

Cada función dentro de una clase, y cada variable de clase debe tomar el argumento propio como señalado.

 class mystuff: def average(a,b,c): #get the average of three numbers result=a+b+c result=result/3 return result def sum(self,a,b): return a+b print mystuff.average(9,18,27) # should raise error print mystuff.sum(18,27) # should be ok 

Si hay variables de clase involucradas:

  class mystuff: def setVariables(self,a,b): self.x = a self.y = b return a+b def mult(self): return x * y # This line will raise an error def sum(self): return self.x + self.y print mystuff.setVariables(9,18) # Setting mystuff.x and mystuff.y print mystuff.mult() # should raise error print mystuff.sum() # should be ok 

Necesita dedicar un poco más de tiempo a algunos fundamentos de la progtwigción orientada a objetos.

Esto suena duro, pero es importante.

  • Su definición de clase es incorrecta, aunque la syntax es aceptable. La definición es simplemente errónea.

  • Su uso de la clase para crear un objeto falta por completo.

  • Su uso de una clase para hacer un cálculo es inapropiado. Se puede hacer este tipo de cosas, pero requiere el concepto avanzado de @staticmehod .

Ya que su código de ejemplo es incorrecto de muchas maneras, no puede obtener una respuesta ordenada para “arreglar esto”. Hay demasiadas cosas para arreglar

Tendrá que ver mejores ejemplos de definiciones de clase. No está claro de qué fuente de información está aprendiendo, pero cualquier libro que esté leyendo es incorrecto o está incompleto.

Descarta cualquier libro o fuente que estés utilizando y encuentra un libro mejor. Seriamente. Te han engañado sobre cómo se ve una definición de clase y cómo se usa.

Es posible que desee consultar http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html para obtener una mejor introducción a las clases, los objetos y Python.

En la función miembro de python de una clase se necesita un self argumento explícito. Igual que this puntero implícito en C ++. Para más detalles por favor visite esta página.

Prueba esto:

 class mystuff: def average(_,a,b,c): #get the average of three numbers result=a+b+c result=result/3 return result #now use the function average from the mystuff class print mystuff.average(9,18,27) 

o esto:

 class mystuff: def average(self,a,b,c): #get the average of three numbers result=a+b+c result=result/3 return result #now use the function average from the mystuff class print mystuff.average(9,18,27) 

Nunca creaste una instancia.

Ha definido el promedio como un método de instancia, por lo tanto, para usar el promedio, primero debe crear una instancia.