私は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()
に引数を与えたと思うのに、明らかにしなかったのはなぜですか?何を間違えたのですか?
エラーは、helloObject.printHello()
のようなメソッドを呼び出すときに暗黙的に渡される暗黙のself
引数を参照しています。このパラメーターは、インスタンスメソッドの定義に明示的に含める必要があります。次のようになります。
class Hello:
def printHello(self):
print('Hello!')
インスタンスメソッドとして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()
オブジェクトのインスタンスでメソッドを呼び出すと、オブジェクト自体(通常はself
)がオブジェクトに返されます。たとえば、Hello().printHello()
を呼び出すことは、最初の引数としてHello
オブジェクトのインスタンスを使用するHello.printHello(Hello())
を呼び出すことと同じです。
代わりに、printHello
ステートメントをdef printHello(self):
として定義します