TypeError: Missing 1 vereiste positionele argument: ‘zelf’

Ik kan niet voorbij de fout:

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'

Ik onderzocht verschillende tutorials, maar er lijkt niet om iets anders dan mijn code. Het enige wat ik kan bedenken is dat Python 3.3 vereist andere syntax.

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
        pass  # dummy code
p = Pump.getPumps()
print(p)

Als ik het goed begrijp, selfwordt de constructeur en methoden automatisch doorgegeven. Wat doe ik verkeerd hier?


Antwoord 1, Autoriteit 100%

U moet een klasse-instantie hier instantiëren.

Gebruik

p = Pump()
p.getPumps()

Kleine bijvoorbeeld –

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

Antwoord 2, Autoriteit 20%

Je moet het eerst initialiseren:

p = Pump().getPumps()

Antwoord 3, Autoriteit 3%

Werken en is eenvoudiger dan elke andere oplossing die ik zie hier:

Pump().getPumps()

Dit is geweldig als je geen klasse-instantie hoeft te herbenen. Getest op Python 3.7.3.


Antwoord 4

U kunt deze fout ook krijgen door voortijdig het advies van Pycharm te nemen om een ​​methode @StaticMethod te annoteren. Verwijder de annotatie.


Antwoord 5

De selftrefwoord in Python is analoog aan thistrefwoord in C++ / JAVA / C #.

In Python 2 wordt het impliciet gedaan door de compiler (ja Python doet intern compilatie).
Het is gewoon dat in Python 3 je het expliciet in de constructor- en ledenfuncties vermeldt. Voorbeeld:

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

Antwoord 6

U kunt de methode zoals pump.getPumps()bellen. Door het toevoegen van @classmethoddecorator op de methode. Een klassenmethode ontvangt de klasse als het impliciete eerste argument, net als een instantie-methode ontvangt het exemplaar.

class Pump:
def __init__(self):
    print ("init") # never prints
@classmethod
def getPumps(cls):
            # Open database connection
            # some stuff here that never gets executed because of error

Dus, gewoon bellen Pump.getPumps().

In Java wordt het genoemd als staticmethode.

Other episodes