Подтвердить что ты не робот

"<method> не принимает аргументов (1 данный)", но я ничего не дал

Я новичок в Python, и я написал этот простой 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()

Когда я запустил его (./hello.py), я получаю следующее сообщение об ошибке:

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)

Почему Python думает, что я дал аргумент printHello(), хотя я этого явно не понял? Что я сделал неправильно?

4b9b3361

Ответ 1

Ошибка относится к неявному аргументу self, который передается неявно при вызове метода типа helloObject.printHello(). Этот параметр должен быть включен явно в определение метода экземпляра. Он должен выглядеть следующим образом:

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

Ответ 2

Если вы хотите printHello как метод экземпляра, он должен всегда принимать аргументы как аргумент (ant python будет проходить неявно) Если вы не хотите printHello как статический метод, тогда вам нужно будет использовать @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()

Как '@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()

Ответ 3

Вызов метода в экземпляре объекта возвращает объект (обычно self) объекту. Например, вызов Hello().printHello() совпадает с вызовом Hello.printHello(Hello()), который в качестве первого аргумента использует экземпляр объекта Hello.

Вместо этого определите оператор printHello как def printHello(self):