TypeError: Missing 1 required positional argument: 'self'

PythonPython 3.x

Python Problem Overview


I can't get past the error:

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'

I examined several tutorials but there doesn't seem to be anything different from my code. The only thing I can think of is that Python 3.3 requires different 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)

If I understand correctly, self is passed to the constructor and methods automatically. What am I doing wrong here?

Python Solutions


Solution 1 - Python

You need to instantiate a class instance here.

Use

p = Pump()
p.getPumps()

Small example -

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

		
>>> testInstance = TestClass()
in init
>>> testInstance.testFunc()
in Test Func

Solution 2 - Python

You need to initialize it first:

p = Pump().getPumps()

Solution 3 - Python

Works and is simpler than every other solution I see here :

Pump().getPumps()

This is great if you don't need to reuse a class instance. Tested on Python 3.7.3.

Solution 4 - Python

The self keyword in Python is analogous to this keyword in C++ / Java / C#.

In Python 2 it is done implicitly by the compiler (yes Python does compilation internally). It's just that in Python 3 you need to mention it explicitly in the constructor and member functions. example:

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

Solution 5 - Python

You can also get this error by prematurely taking PyCharm's advice to annotate a method @staticmethod. Remove the annotation.

Solution 6 - Python

You can call the method like pump.getPumps(). By adding @classmethod decorator on the method. A class method receives the class as the implicit first argument, just like an instance method receives the instance.

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

So, simply call Pump.getPumps() .

In java, it is termed as static method.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDominicMView Question on Stackoverflow
Solution 1 - PythonSukrit KalraView Answer on Stackoverflow
Solution 2 - PythonJBernardoView Answer on Stackoverflow
Solution 3 - PythonJay D.View Answer on Stackoverflow
Solution 4 - PythonTahir77667View Answer on Stackoverflow
Solution 5 - PythonghersonView Answer on Stackoverflow
Solution 6 - PythonAtomView Answer on Stackoverflow