«<method> не принимает аргументов (1 дано)», но я не дал ни одного - PullRequest
24 голосов
/ 07 июля 2011

Я новичок в Python и написал этот простой скрипт:

#!/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() аргумент, а я явно нет? Что я сделал не так?

Ответы [ 3 ]

40 голосов
/ 07 июля 2011

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

class Hello:
  def printHello(self):
      print('Hello!')
6 голосов
/ 07 июля 2011

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

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

6 голосов
/ 07 июля 2011

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