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, self
wordt 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 self
trefwoord in Python is analoog aan this
trefwoord 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 @classmethod
decorator 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 static
methode.