web-dev-qa-db-ja.com

「<method>は引数を取りません(1つ与えられました)」しかし私は何も与えませんでした

私は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()に引数を与えたと思うのに、明らかにしなかったのはなぜですか?何を間違えたのですか?

24
user142019

エラーは、helloObject.printHello()のようなメソッドを呼び出すときに暗黙的に渡される暗黙のself引数を参照しています。このパラメーターは、インスタンスメソッドの定義に明示的に含める必要があります。次のようになります。

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

インスタンスメソッドとして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()
6
Felipe Cruz

オブジェクトのインスタンスでメソッドを呼び出すと、オブジェクト自体(通常はself)がオブジェクトに返されます。たとえば、Hello().printHello()を呼び出すことは、最初の引数としてHelloオブジェクトのインスタンスを使用するHello.printHello(Hello())を呼び出すことと同じです。

代わりに、printHelloステートメントをdef printHello(self):として定義します

6
TorelTwiddler