TypeError: Brak 1 wymaganego argumentu pozycyjnego: „self”

217

Jestem nowy w Pythonie i uderzyłem w ścianę. Wykonałem kilka samouczków, ale nie mogę ominąć błędu:

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'

Przejrzałem kilka samouczków, ale wydaje mi się, że nic nie różni się od mojego kodu. Jedyne, co mogę wymyślić, to że Python 3.3 wymaga innej składni.

główny scipt:

# test script

from lib.pump import Pump

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

p = Pump.getPumps()

print (p)

Klasa pompy:

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

Jeśli dobrze rozumiem, „self” jest automatycznie przekazywane konstruktorowi i metodom. Co ja tu robię źle?

Korzystam z systemu Windows 8 z python 3.3.2

DominicM
źródło

Odpowiedzi:

281

Musisz tutaj utworzyć instancję klasy.

Posługiwać się

p = Pump()
p.getPumps()

Mały przykład -

>>> 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
źródło
1
Próbowałem tego wcześniej, ale brakowało „()”. Czy to nowe w Pythonie 3.x?
DominicM,
1
@DominicM: Nie, zawsze tak było.
Sukrit Kalra,
1
Tak, patrząc na samouczki, które
śledziłem
4
nazwy klas powinny być pisane wielkimi literami, tzn. „testClass” powinien być „TestClass”
eggonlegs
1
Dziękuję, brakujące nawiasy przy tworzeniu instancji klasy były moim problemem. Twój przykład jest bardzo jasny.
Paul Watson,
57

Najpierw musisz go zainicjować:

p = Pump().getPumps()
JBernardo
źródło
14
Prostota jest często niedoceniana.
theeastcoastwest
14
Wykonanie tego spowoduje, że p będzie równe metodzie getPumps (), podczas gdy uruchomiłoby to p nie byłby „użyteczny” jako zmienna dla klasy Pump (). Nie jest to wielka praktyka, ponieważ po prostu tworzy bezużyteczną zmienną. Jeśli jedynym celem jest uruchomienie funkcji getPumps, wówczas wystarczyłoby uruchomienie Pump (). GetPumps () zamiast tworzenia zmiennej dla tej funkcji.
Ashmoreinc
7

Działa i jest prostsze niż każde inne rozwiązanie, które tu widzę:

Pump().getPumps()

Jest to świetne, jeśli nie trzeba ponownie wykorzystywać instancji klasy. Testowane na Pythonie 3.7.3.

Jay D.
źródło
2

Możesz również uzyskać ten błąd, przedwcześnie stosując się do rady PyCharm, aby opisać metodę @staticmethod. Usuń adnotację.

korniszon
źródło
1

„Ja” słowo kluczowe w Pythonie jest analogiczna do „to” słowo kluczowe w C ++ / Java / C #.

W Pythonie 2 odbywa się to niejawnie przez kompilator (yes python does compilation internally). Po prostu w Pythonie 3 musisz wspomnieć o tym explicitlyw funkcjach konstruktora i członków. przykład:

 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
źródło