キーワード引数を持つクラスメソッドを次のように定義します。
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 はにも割り当てようとするため、例外が発生します。myfoo
thing
thing
"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」への参照が割り当てられていることがわかります。このセクションドキュメントでは、関数の引数がどのように機能するかについてもう少し詳しく説明しています。