Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"<method> takes no arguments (1 given)" but I gave none [duplicate]

I am new to Python and I have written this simple script:

#!/usr/bin/python3
import sys

class Hello:
    def printHello():
        print('Hello!')

def main():
    helloObject = Hello()
    helloObject.printHello()   # Here is the error

if __name__ == '__main__':
    main()

When I run it (./hello.py) I get the following error message:

Traceback (most recent call last):
  File "./hello.py", line 13, in <module>
    main()
  File "./hello.py", line 10, in main
    helloObject.printHello()
TypeError: printHello() takes no arguments (1 given)

Why does Python think I gave printHello() an argument while I clearly did not? What have I done wrong?


2 Answers

The error is referring to the implicit self argument that is passed implicitly when calling a method like helloObject.printHello(). This parameter needs to be included explicitly in the definition of an instance method. It should look like this:

class Hello:
  def printHello(self):
      print('Hello!')
like image 71
hammar Avatar answered Sep 15 '25 07:09

hammar


If you want printHello as instance method, it should receive self as argument always(ant python will pass implicitly) Unless you want printHello as a static method, then you'll have to use @staticmethod

#!/usr/bin/python3
import sys

class Hello:
    def printHello(self):
        print('Hello!')

def main():
    helloObject = Hello()
    helloObject.printHello()   # Here is the error

if __name__ == '__main__':
    main()

As '@staticmethod'

#!/usr/bin/python3
import sys

class Hello:
    @staticmethod
    def printHello():
        print('Hello!')

def main():
    Hello.printHello()   # Here is the error

if __name__ == '__main__':
    main()
like image 34
Felipe Cruz Avatar answered Sep 15 '25 07:09

Felipe Cruz