TypeError: falta 1 argumento posicional requerido: 'self'

219

Soy nuevo en Python y he chocado contra una pared. Seguí varios tutoriales pero no puedo superar el error:

Traceback (most recent call last):
  File "C:\Users\Dom\Desktop\test\test.py", line 7, in <module>
    p = Pump.getPumps()
TypeError: getPumps() missing 1 required positional argument: 'self'

Examiné varios tutoriales, pero no parece haber nada diferente de mi código. Lo único que se me ocurre es que Python 3.3 requiere una sintaxis diferente.

scipt principal:

# test script

from lib.pump import Pump

print ("THIS IS A TEST OF PYTHON") # this prints

p = Pump.getPumps()

print (p)

Clase de la bomba:

import pymysql

class Pump:

    def __init__(self):
        print ("init") # never prints


    def getPumps(self):
                # Open database connection
                # some stuff here that never gets executed because of error

Si entiendo correctamente, "self" se pasa al constructor y a los métodos automáticamente. ¿Qué estoy haciendo mal aquí?

Estoy usando Windows 8 con Python 3.3.2

DominicM
fuente

Respuestas:

283

Necesita crear una instancia de clase aquí.

Utilizar

p = Pump()
p.getPumps()

Pequeño ejemplo

>>> class TestClass:
        def __init__(self):
            print("in init")
        def testFunc(self):
            print("in Test Func")


>>> testInstance = TestClass()
in init
>>> testInstance.testFunc()
in Test Func
Sukrit Kalra
fuente
1
Intenté eso antes pero faltaba "()". ¿Es eso nuevo en Python 3.x?
DominicM
1
@DominicM: No, eso siempre ha estado ahí.
Sukrit Kalra
1
Sí, mirando hacia atrás a los tutoriales que seguí, mi cerebro debe haber
borrado
44
los nombres de clase deben estar en mayúscula, es decir, 'testClass' debe ser 'TestClass'
eggonlegs
1
Gracias, faltar paréntesis en la creación de instancias de clase fue mi problema. Tu ejemplo es súper claro.
Paul Watson
57

Primero debe inicializarlo:

p = Pump().getPumps()
JBernardo
fuente
14
La simplicidad es a menudo subestimada.
theeastcoastwest
14
Hacer esto haría que p sea igual al método getPumps (), mientras que esto ejecutaría p no sería 'usable' como una variable para la clase Pump (). Esto no es una buena práctica porque solo crea una variable inútil. Si el único objetivo es ejecutar la función getPumps, entonces funcionaría simplemente ejecutando Pump (). GetPumps () en lugar de crear una variable para la función.
Ashmoreinc
7

Funciona y es más simple que cualquier otra solución que veo aquí:

Pump().getPumps()

Esto es genial si no necesita reutilizar una instancia de clase. Probado en Python 3.7.3.

Jay D.
fuente
2

También puede obtener este error tomando prematuramente el consejo de PyCharm para anotar un método @staticmethod. Eliminar la anotación.

Gherson
fuente
1

La palabra clave 'self' en python es análoga a 'this' palabra clave en c ++ / java / c #.

En python 2, el compilador lo hace implícitamente (yes python does compilation internally). Es solo que en Python 3 necesita mencionarlo explicitlyen las funciones de constructor y miembro. ejemplo:

 class Pump():
 //member variable
 account_holder
 balance_amount

   // constructor
   def __init__(self,ah,bal):
   |    self.account_holder = ah
   |    self.balance_amount = bal

   def getPumps(self):
   |    print("The details of your account are:"+self.account_number + self.balance_amount)

 //object = class(*passing values to constructor*)
 p = Pump("Tahir",12000)
 p.getPumps()
Tahir77667
fuente