"<method>不需要参数(给出了1个)",但我没有提供任何参数。

24

我是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

该错误是指在调用像 helloObject.printHello() 这样的方法时,会隐式传递 self 参数。这个参数需要在实例方法的定义中显式地包含。应该像这样:

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

6
如果你想让printHello成为实例方法,它应该始终接收self作为参数(在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()

1
类方法(Class method) != 静态方法(static method)。 - Fred Foo

6

在对象实例上调用方法会将对象本身(通常为self)返回给对象。例如,调用Hello().printHello()与调用Hello.printHello(Hello())相同,它使用一个Hello对象的实例作为第一个参数。

相反,应将printHello语句定义为def printHello(self):


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接