TypeError: method () toma 1 argumento posicional pero 2 fueron dados

Si tengo una clase …

class MyClass: def method(arg): print(arg) 

… que uso para crear un objeto …

 my_object = MyClass() 

… en lo que yo llamo method("foo") como así …

 >>> my_object.method("foo") Traceback (most recent call last): File "", line 1, in  TypeError: method() takes exactly 1 positional argument (2 given) 

… ¿por qué Python me dice que le di dos argumentos, cuando solo di uno?

En Python, esto:

 my_object.method("foo") 

… es azúcar sintáctica , que el intérprete traduce tras bambalinas a:

 MyClass.method(my_object, "foo") 

… que, como puede ver, sí tiene dos argumentos: es solo 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 realizan algún trabajo con el objeto al que se llama, por lo que es necesario que haya alguna forma de hacer 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:

 class MyNewClass: def method(self, arg): print(self) print(arg) 

Si llama al method("foo") en una instancia de MyNewClass , funciona como se esperaba:

 >>> my_new_object = MyNewClass() >>> my_new_object.method("foo") <__main__.MyNewClass object at 0x29045d0> foo 

De vez en cuando (pero no a menudo), realmente no le importa el objeto al que está vinculado su método, y en ese caso, puede decorar el método con la función staticmethod() incorporada para decirlo:

 class MyOtherClass: @staticmethod def method(arg): print(arg) 

… en cuyo caso no es necesario agregar un argumento self a la definición del método, y aún funciona:

 >>> my_other_object = MyOtherClass() >>> my_other_object.method("foo") foo 

Algo más a tener en cuenta cuando se encuentra este tipo de error:

Me estaba ejecutando en este mensaje de error y encontré útil esta publicación. Resulta que en mi caso había anulado un init () donde había herencia de objetos.

El ejemplo heredado es bastante largo, así que me saltaré a un ejemplo más simple que no usa herencia:

 class MyBadInitClass: def ___init__(self, name): self.name = name def name_foo(self, arg): print(self) print(arg) print("My name is", self.name) class MyNewClass: def new_foo(self, arg): print(self) print(arg) my_new_object = MyNewClass() my_new_object.new_foo("NewFoo") my_bad_init_object = MyBadInitClass(name="Test Name") my_bad_init_object.name_foo("name foo") 

El resultado es:

 <__main__.MyNewClass object at 0x033C48D0> NewFoo Traceback (most recent call last): File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in  my_bad_init_object = MyBadInitClass(name="Test Name") TypeError: object() takes no parameters 

PyCharm no atrapó este error tipográfico. Tampoco lo hizo Notepad ++ (otros editores / IDE’s).

Por supuesto, este es un error de tipo “no requiere 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 utilizará un inicializador de sobrecarga si es sintácticamente correcto, pero si no, se ignorará y se usará la función incorporada. El objeto no esperará / manejará esto y se lanzará el error.

En el caso del error de sytax: la solución es simple, simplemente edite la instrucción de inicio personalizada:

 def __init__(self, name): self.name = name 

Ocurre cuando no especifica el no de parámetros que el init () o cualquier otro método que busca

Por ejemplo

 class Dog: def __init__(self): print("IN INIT METHOD") def __unicode__(self,): print("IN UNICODE METHOD") def __str__(self): print("IN STR METHOD") obj=Dog("JIMMY",1,2,3,"WOOF") 

Cuando ejecutas el progtwig anterior, te da un error como el que TypeError: __init __ () toma 1 argumento posicional pero 6 fueron dados

¿Cómo podemos deshacernos de esto?

simplemente pasa los parámetros, qué método init () busca

 class Dog: def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText): self.name_of_dog = dogname self.date_of_birth = dob_d self.month_of_birth = dob_m self.year_of_birth = dob_y self.sound_it_make = dogSpeakText def __unicode__(self, ): print("IN UNICODE METHOD") def __str__(self): print("IN STR METHOD") obj = Dog("JIMMY", 1, 2, 3, "WOOF") print(id(obj)) 

Pase el parámetro cls a @classmethod para resolver este problema.

 @classmethod def test(cls): return ''