クラスメソッドは「TypeError: ... キーワード引数に複数の値があります ...」を生成します。質問する

クラスメソッドは「TypeError: ... キーワード引数に複数の値があります ...」を生成します。質問する

キーワード引数を持つクラスメソッドを次のように定義します。

class foo(object):
  def foodo(thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

メソッドを呼び出すと、次が生成されますTypeError:

myfoo = foo()
myfoo.foodo(thing="something")

...
TypeError: foodo() got multiple values for keyword argument 'thing'

どうしたの?

ベストアンサー1

問題は、Python のクラス メソッドに渡される最初の引数が、常にメソッドが呼び出されるクラス インスタンスのコピー (通常は というラベルが付けられます) であることですself。クラスが次のように宣言されている場合:

class foo(object):
  def foodo(self, thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

期待通りに動作します。

説明:

self最初のパラメータとしてがない場合、myfoo.foodo(thing="something")が実行されると、foodoメソッドは引数 で呼び出されます。次に、(myfoo, thing="something")インスタンスが に割り当てられます( は最初に宣言されたパラメータであるため)。ただし、Python はにも割り当てようとするため、例外が発生します。myfoothingthing"something"thing

デモとして、元のコードでこれを実行してみてください。

myfoo.foodo("something")
print
print myfoo

出力は次のようになります:

<__main__.foo object at 0x321c290>
a thong is something

<__main__.foo object at 0x321c290>

「thing」にクラス「foo」のインスタンス「myfoo」への参照が割り当てられていることがわかります。このセクションドキュメントでは、関数の引数がどのように機能するかについてもう少し詳しく説明しています。

おすすめ記事