método de clase sin argumentos produce TypeError

Este código:

class testclass: def __init__(self,x,y): self.x = x self.y = y self.test() def test(): print('test') if __name__ == '__main__': x = testclass(2,3) 

rendimientos

 Error: TypeError:test() takes no argument(1 given) 

Estoy llamando a la función de prueba sin ningún parámetro, ¿por qué el error dice que le he dado uno?

Usted llama a los métodos como self.test() . Mentalmente, debe traducir eso a test(self) para averiguar cómo se “recibirá” la llamada en la definición de la función. Sin embargo, su definición de test es simplemente def test() , que no tiene lugar para el self , por lo que obtiene el error que observó.

¿Por qué es este el caso? Debido a que Python solo puede buscar atributos cuando se le da específicamente un objeto para mirar (y buscar atributos incluye llamadas a métodos). Entonces, para que el método haga cualquier cosa que dependa de qué objeto se invocó, necesita recibir ese objeto de alguna manera. El mecanismo para recibirlo es que sea el primer argumento.

Es posible decirle a Python que la test realidad no se necesita a self , usando el decorador de staticmethod . En ese caso, Python sabe que el método no se necesita a self , por lo que no intenta agregarlo como primer argumento. Entonces, cualquiera de las siguientes definiciones para la test solucionará su problema:

 def test(self): print('test') 

O:

 @staticmethod def test(): print('test') 

Tenga en cuenta que esto solo tiene que ver con los métodos invocados en objetos (que siempre se parece a some_object.some_method(...) ). La invocación de la función normal (que se parece a la function(...) ) no tiene nada “a la izquierda del punto”, por lo que no hay un self , por lo que no se pasará automáticamente.

Pase self a su método de test :

 def test(self): print('test') 

Debe hacer esto porque Python pasa explícitamente un parámetro que se refiere al objeto instanciado como el primer parámetro. No debe omitirse, incluso si no hay argumentos para el método (debido al error especificado).

Python siempre pasa la instancia como el primer argumento de los métodos de instancia, esto significa que a veces los mensajes de error relacionados con el número de argumentos parecen estar desactivados en uno.

 class testclass: def __init__(self,x,y): self.x = x self.y = y self.test() def test(self): ## instance method print('test', self) if __name__ == '__main__': x = testclass(2,3) 

Si no necesita acceder a la clase o la instancia, puede usar un método estático como se muestra a continuación

 class testclass: def __init__(self,x,y): self.x = x self.y = y self.test() @staticmethod def test(): print('test') if __name__ == '__main__': x = testclass(2,3) 

Un método de clase es similar, si necesita acceso a la class , pero no a la instancia

 class testclass: def __init__(self,x,y): self.x = x self.y = y self.test() @classmethod def test(cls): print('test', cls) if __name__ == '__main__': x = testclass(2,3)