TypeError: Es fehlt 1 erforderliches Positionsargument: 'self'

217

Ich bin neu in Python und habe eine Wand getroffen. Ich habe mehrere Tutorials befolgt, kann aber den Fehler nicht überwinden:

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'

Ich habe mehrere Tutorials untersucht, aber es scheint nichts anderes zu geben als mein Code. Ich kann mir nur vorstellen, dass Python 3.3 eine andere Syntax erfordert.

Hauptskript:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Pumpenklasse:

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

Wenn ich das richtig verstehe, wird "self" automatisch an den Konstruktor und die Methoden übergeben. Was mache ich hier falsch?

Ich verwende Windows 8 mit Python 3.3.2

DominicM
quelle

Antworten:

280

Sie müssen hier eine Klasseninstanz instanziieren.

Verwenden

p = Pump()
p.getPumps()

Kleines Beispiel -

>>> 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
quelle
1
Versuchte das vorher aber fehlte "()". Ist das neu in Python 3.x?
DominicM
1
@ DominicM: Nein, das war schon immer da.
Sukrit Kalra
1
Ja, wenn ich auf die Tutorials zurückblicke, denen ich gefolgt bin, muss mein Gehirn gerade die Klammern verdunkelt haben :)
DominicM
4
Klassennamen sollten in Großbuchstaben geschrieben sein, dh 'testClass' sollte 'TestClass' sein
Eggonlegs
1
Vielen Dank, fehlende Klammern bei der Instanziierung von Klassen waren mein Problem. Ihr Beispiel ist super klar.
Paul Watson
57

Sie müssen es zuerst initialisieren:

p = Pump().getPumps()
JBernardo
quelle
14
Einfachheit wird oft unterbewertet.
Theeastcoastwest
14
Wenn Sie dies tun, würde p gleich der Methode getPumps () sein, während dies p ausführen würde. P wäre als Variable für die Pump () -Klasse nicht 'verwendbar'. Dies ist imo keine großartige Übung, da nur eine nutzlose Variable erstellt wird. Wenn das einzige Ziel darin besteht, die Funktion getPumps auszuführen, funktioniert dies nur mit Pump (). GetPumps (), anstatt eine Variable für die Funktion zu erstellen.
Ashmoreinc
7

Funktioniert und ist einfacher als jede andere Lösung, die ich hier sehe:

Pump().getPumps()

Dies ist ideal, wenn Sie eine Klasseninstanz nicht wiederverwenden müssen. Getestet auf Python 3.7.3.

Jay D.
quelle
2

Sie können diesen Fehler auch erhalten, indem Sie PyCharms Rat vorzeitig befolgen, um eine Methode @staticmethod mit Anmerkungen zu versehen. Entfernen Sie die Anmerkung.

gherson
quelle
1

Das Schlüsselwort 'self' in Python entspricht dem Schlüsselwort 'this' in c ++ / java / c #.

In Python 2 wird dies implizit vom Compiler ausgeführt (yes python does compilation internally). Es ist nur so, dass Sie es in Python 3 explicitlyin den Konstruktor- und Memberfunktionen erwähnen müssen. Beispiel:

 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
quelle