TypeError: 1 argument de position requis manquant: 'self'

219

Je suis nouveau sur python et j'ai heurté un mur. J'ai suivi plusieurs tutoriels mais je ne peux pas surmonter 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 il ne semble pas y avoir de différence avec 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

DominicM
la source

Réponses:

283

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
Sukrit Kalra
la source
1
J'ai essayé avant mais il manquait "()". Est-ce nouveau dans python 3.x?
DominicM
1
@DominicM: Non, ça a toujours été là.
Sukrit Kalra
1
Yup, en regardant les tutoriels que j'ai suivis, mon cerveau doit juste avoir noirci les crochets :)
DominicM
4
les noms de classe doivent être en majuscules, c'est-à-dire que «testClass» doit être «TestClass»
eggonlegs
1
Merci, les parenthèses manquantes lors de l'instanciation de classe étaient mon problème. Votre exemple est super clair.
Paul Watson
57

Vous devez d'abord l'initialiser:

p = Pump().getPumps()
JBernardo
la source
14
La simplicité est souvent sous-estimée.
theeastcoastwest
14
Faire cela rendrait p égal à la méthode getPumps (), tandis que cela exécuterait p ne serait pas «utilisable» comme variable pour la classe Pump (). Ce n'est pas une excellente pratique car il suffit de créer une variable inutile. Si le seul objectif est d'exécuter la fonction getPumps, cela fonctionnerait simplement en exécutant Pump (). GetPumps () au lieu de créer une variable pour la fonction.
Ashmoreinc
7

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.

Jay D.
la source
2

Vous pouvez également obtenir cette erreur en suivant prématurément les conseils de PyCharm pour annoter une méthode @staticmethod. Supprimez l'annotation.

gherson
la source
1

Le mot clé 'self' en python est analogue au mot clé 'this' en c ++ / java / c #.

En python 2, cela se fait implicitement par le compilateur (yes python does compilation internally). C'est juste qu'en python 3 vous devez le mentionner explicitlydans 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()
Tahir77667
la source