Si tengo una clase ...
class MyClass:
def method(arg):
print(arg)
... que uso para crear un objeto ...
my_object = MyClass()
... en el que llamo method("foo")
así ...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... ¿por qué Python me dice que le di dos argumentos, cuando solo di uno?
self
. Entonces declarardef method(arg):
es incorrecto para un método, debería serlodef method(self, arg):
. Cuando el envío del método intenta llamarmethod(arg):
y hacer coincidir dos parámetrosself, arg
con él, obtienes ese error.Respuestas:
En Python, esto:
... es azúcar sintáctica , que el intérprete traduce detrás de escena en:
... que, como puede ver, tiene dos argumentos: es que el primero es implícito, desde el punto de vista de la persona que llama.
Esto se debe a que la mayoría de los métodos funcionan con el objeto al que están llamados, por lo que debe haber alguna forma de que se haga referencia a ese objeto dentro del método. Por convención, este primer argumento se llama
self
dentro de la definición del método:Si llama
method("foo")
a una instancia deMyNewClass
, funciona como se esperaba:Ocasionalmente (pero no con frecuencia), realmente no le importa el objeto al que está vinculado su método, y en esa circunstancia, puede decorar el método con la
staticmethod()
función incorporada para decirlo:... en cuyo caso no necesita agregar un
self
argumento a la definición del método, y aún funciona:fuente
self
como primer argumento al método resuelve el problema.Algo más a considerar cuando se encuentra este tipo de error:
Me encontré con este mensaje de error y encontré útil esta publicación. Resulta que en mi caso había anulado un lugar
__init__()
donde había herencia de objetos.El ejemplo heredado es bastante largo, por lo que pasaré a un ejemplo más simple que no usa herencia:
El resultado es:
PyCharm no captó este error tipográfico. Tampoco Notepad ++ (otros editores / IDE podrían).
Por supuesto, este es un TypeError "no toma parámetros", no es muy diferente de "tiene dos" cuando se espera uno, en términos de inicialización de objetos en Python.
Abordar el tema: se usará un inicializador de sobrecarga si es sintácticamente correcto, pero si no se ignorará y se utilizará el incorporado. El objeto no esperará / manejará esto y se arrojará el error.
En el caso del error de sintaxis: la solución es simple, solo edite la instrucción init personalizada:
fuente
SyntaxError
aqui. El código es sintácticamente correcto; simplemente define correctamente un método llamado___init__
, que nadie va a llamar, en lugar del método especial__init__
. Es por eso que no se detecta ningún error, porque no hay uno para detectar.En palabras simples
En Python, debe agregar el
self
argumento como primer argumento para todos los métodos definidos en las clases:Luego puede usar su método de acuerdo con su intuición:
Esto debería solucionar tu problema :)
Para una mejor comprensión, también puede leer las respuestas a esta pregunta: ¿Cuál es el propósito de uno mismo?
fuente
Recién llegado a Python, tuve este problema cuando estaba usando la
**
función de Python de forma incorrecta. Intentando llamar a esta definición desde algún lugar:usar una llamada sin una estrella doble estaba causando el problema:
La solución es agregar
**
al argumento:fuente
*args
(/**kwargs
).Ocurre cuando no especifica el no de parámetros que el
__init__()
o cualquier otro método que busca.Por ejemplo:
Cuando ejecuta el programa anterior, le da un error como ese:
¿Cómo podemos deshacernos de esta cosa?
Simplemente pase los parámetros, qué
__init__()
método está buscandofuente
Deberías crear una clase:
fuente
En mi caso, olvidé agregar el
()
Estaba llamando al método así
Pero debería ser así
fuente
Pase el
cls
parámetro a@classmethod
para resolver este problema.fuente