1. ホーム
  2. パイソン

Python3のクラスメソッドで位置引数を0個取るが、1個与えられたというエラーが発生する

2022-02-23 08:33:08
<パス

問題:Pythonオブジェクト指向の学習中、プログラムがエラーを報告する位置引数が0個だが、1個与えられている

まず、次のようにクラスを定義します。

# Define a class
class cat:
	#properties

	#methods
	def eat():
		print("The cat can eat. ")
	def catch():
		print("The cat can catch the mouse")
# Create an object
tom=cat()
# Call the method in the object pointed to by tom
tom.catch()


実行すると、プログラムがエラーを報告します: catch() は位置引数を 0 個取りますが、1 個が与えられました。
これは、catch()メソッドに位置引数がないのに、1つ指定されたことを意味します。
  調べてみると、Pythonがクラスでメソッドを定義する場合、パラメータとしてカレントオブジェクトのアドレスが渡されるため、一般的にクラスでメソッドを定義する場合、そのメソッドに少なくとも1つのパラメータを定義しなければならないことがわかりました。 一般的には "self" と名付けますが、インスタンスメソッドの最初のパラメータは self と呼ぶ必要はなく、実際には a,b,c など、どんなパラメータ名でも構いません。ただ、慣習的にパラメータに self と名付けると、コードが読みやすくなります。

修正したコード

#Define a class
class cat:
	#properties
	#methods
	def eat(lf):
		print("The cat can eat. ")
	def catch(elf):
		print("The cat can catch the mouse")
# Create an object
tom=cat()
# Call the method in the object pointed to by tom
tom.catch()


注:関連情報です。

  1. 原文のままです。クラスで定義されたメソッドは、デフォルトではインスタンスメソッドです。インスタンスメソッドを定義するメソッドは基本的に関数を定義するメソッドと同じですが、インスタンスメソッドの最初の引数はメソッドの呼び出し側(クラスのインスタンス)に束縛されます - したがってインスタンスメソッドは少なくとも一つの引数を定義しなければならず、その引数は通常 self という名前になるでしょう。---- クレイジーPythonレクチャーノートより

2)
      ---- ルーキーティーチより https://www.runoob.com/python/python-object.html