431 Stimmen

Warum erhalte ich den Fehler "TypeError: Fehlendes 1 erforderliches Positionales Argument: 'self'", wenn ich versuche, eine Methode direkt aus der Klasse aufzurufen?

Ich habe etwas Code wie:

class Pump:    
    def __init__(self):
        print("init")

    def getPumps(self):
        pass

p = Pump.getPumps()
print(p)

Aber ich bekomme einen Fehler wie:

Traceback (most recent call last):
  File "C:\Users\Dom\Desktop\test\test.py", line 7, in 
    p = Pump.getPumps()
TypeError: getPumps() fehlt 1 erforderliches Positional-Argument: 'self'

Warum wird __init__ nicht aufgerufen und was bedeutet diese Ausnahme? Meiner Meinung nach wird self automatisch an den Konstruktor und die Methoden übergeben. Was mache ich hier falsch?

569voto

Sukrit Kalra Punkte 33037

Um die Klasse zu verwenden, erstellen Sie zuerst eine Instanz, so:

p = Pump()
p.getPumps()

Ein vollständiges Beispiel:

>>> class TestClass:
...     def __init__(self):
...         print("init")
...     def testFunc(self):
...         print("Test Func")
... 
>>> testInstance = TestClass()
init
>>> testInstance.testFunc()
Test Func

98voto

JBernardo Punkte 30924

Sie müssen es zuerst initialisieren:

p = Pump().getPumps()

20voto

Jay D. Punkte 1156

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

Pumpe().PumpenHolen()

Das ist großartig, wenn Sie keine Klasseinstanz wiederverwenden müssen. Getestet auf Python 3.7.3.

10voto

Atom Punkte 320

Durch das Hinzufügen eines @classmethod-Dekorators zur Methode kann sie wie Pump.getPumps() aufgerufen werden.

Eine Klassenmethode erhält die Klasse als implizites erstes Argument, genau wie eine Instanzmethode die Instanz erhält.

class Pump:
    def __init__(self):
        print("init")

    @classmethod
    def getPumps(cls):
        pass

7voto

Tahir77667 Punkte 1818

Das Schlüsselwort self in Python ist analog zum Schlüsselwort this in C++ / Java / C#.

In Python 2 wird dies implizit vom Compiler erledigt (ja, Python kompiliert intern). Es ist nur so, dass Sie es in Python 3 explizit im Konstruktor und in den Methoden angeben müssen. Beispiel:

class Pumpe():
    # member variable
    # account_holder
    # balance_amount

    # Konstruktor
    def __init__(self,ah,bal):
        self.account_holder = ah
        self.balance_amount = bal

    def getPumps(self):
        print("Die Details Ihres Kontos lauten:"+self.account_number + self.balance_amount)

# Objekt = Klasse(*Werte an den Konstruktor übergeben*)
p = Pumpe("Tahir",12000)
p.getPumps()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X