tutorial positional missing argument python python-3.x arguments self

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



self. python tutorial (4)

Si tengo una clase ...

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

... que uso para crear un objeto ...

my_object = MyClass()

... en lo que llamo method("foo") como tal ...

>>> 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?


Además, como en mi caso, asegúrese de que todavía tenga un parámetro en la función. Pasé por alto eso.

tuve

class MyClass(): def foo(foo_string): return get_bar(foo_string)

Cuando fui y cambié el método y eliminé el parámetro, olvidé actualizar mis otros archivos que usaban la misma función.

TLDR; Refactoriza tu código.


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 init () donde había herencia de objetos.

El ejemplo heredado es bastante largo, así que voy a 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 <module> my_bad_init_object = MyBadInitClass(name="Test Name") TypeError: object() takes no parameters

PyCharm no detectó este error tipográfico. Tampoco lo hizo Notepad ++ (otros editores / IDE podrían).

Por supuesto, este es un TypeError "no toma ningún parámetro", no es muy diferente a "got two" cuando esperaba 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á el incorporado. El objeto no esperará / manejará esto y se lanzará el error.

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

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


En Python, esto:

my_object.method("foo")

... es azúcar sintáctica , que el intérprete traduce detrás de escena en:

MyClass.method(my_object, "foo")

... que, como puede ver, sí tiene dos argumentos: es solo que el primero está implícito, desde el punto de vista de quien 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 referirse 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 llamas 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

Ocasionalmente (pero no a menudo), realmente no le importa el objeto al que está sujeto su método, y en esa circunstancia, puede decorate el método con la función incorporada staticmethod() para decirlo:

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

... en cuyo caso no necesita agregar un self argumento a la definición del método, y todavía funciona:

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


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

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 ejecuta el programa anterior, le da un error como ese TypeError: __init __ () toma 1 argumento de posición pero se le dieron 6

¿Cómo podemos deshacernos de esto?

solo 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))