Posterior a observar en diversos repositorios y sitios de internet al final hemos dado con la respuesta que te enseñamos pronto.
Solución:
En Python, esto:
my_object.method("foo")
…es azúcar sintáctico, que el intérprete traduce tras bambalinas en:
MyClass.method(my_object, "foo")
…que, como puede ver, tiene dos argumentos, es solo que el primero está 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 se llaman, por lo que debe haber 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 llamas 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 se preocupa por el objeto al que está vinculado su método, y en esa circunstancia, puede decorar el método con el incorporado staticmethod()
función para decirlo:
class MyOtherClass:
@staticmethod
def method(arg):
print(arg)
… en cuyo caso no es necesario 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
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 pasaré a un ejemplo más simple que no usa la 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 detectó este error tipográfico. Notepad++ tampoco (otros editores/IDE podrían).
Por supuesto, este es un TypeError “no toma parámetros”, no es muy diferente de “obtuve dos” cuando esperaba 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 usará el integrado en su lugar. El objeto no espera/maneja esto y se lanza el error.
En el caso del error de sytax: la solución es simple, simplemente edite la declaración de inicio personalizada:
def __init__(self, name):
self.name = name
En palabras simples.
En Python debes agregar self
argumento como el primer argumento para todos los métodos definidos en las clases:
class MyClass:
def method(self, arg):
print(arg)
Entonces puedes usar tu método de acuerdo a tu intuición:
>>> my_object = MyClass()
>>> my_object.method("foo")
foo
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?
Te mostramos las reseñas y valoraciones de los lectores
Si posees alguna sospecha o forma de arreglar nuestro enunciado puedes añadir una observación y con deseo lo analizaremos.