web-dev-qa-db-fra.com

TypeError: Il manque 1 argument positionnel requis: 'self'

Je suis nouveau sur python et je me suis heurté à un mur. J'ai suivi plusieurs tutoriels mais je ne peux pas dépasser l'erreur:

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'

J'ai examiné plusieurs tutoriels, mais rien ne semble différent de mon code. La seule chose à laquelle je peux penser est que python 3.3 nécessite une syntaxe différente.

scipt principal:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Classe de pompe:

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 je comprends bien, "self" est transmis automatiquement au constructeur et aux méthodes. Qu'est-ce que je fais mal ici?

J'utilise Windows 8 avec python 3.3.2

148
DominicM

Vous devez instancier une instance de classe ici.

Utilisation

p = Pump()
p.getPumps()

Petit exemple -

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


>>> testInstance = TestClass()
in init
>>> testInstance.testFunc()
in Test Func
189
Sukrit Kalra

Vous devez d'abord l'initialiser:

p = Pump().getPumps()
39
JBernardo

Fonctionne et est plus simple que toutes les autres solutions que je vois ici:

Pump().getPumps()

C'est très bien si vous n'avez pas besoin de réutiliser une instance de classe. Testé sur Python 3.7.3.

3
Jay D.

Vous pouvez également obtenir cette erreur en prenant prématurément l'avis de PyCharm pour annoter une méthode @staticmethod. Supprimer l'annotation.

2
gherson

Le mot clé 'self' dans python est analogue à 'ceci' dans c ++/Java/c #.

Dans python 2, cette opération est effectuée implicitement par le compilateur (yes python does compilation internally). C'est juste que dans python 3, vous devez le mentionner explicitly dans les fonctions constructeur et membre. exemple:

 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()
1
Tahir77667