2016-10-12 14 views
2

継承されたメソッドでは、キーワード引数は何らかの形で特別に処理されますか?スーパークラスのキーワード引数を持つPython 2.7関数:サブクラスからのアクセス方法?

定義されているクラスのキーワード引数を使用してインスタンスメソッドを呼び出すと、すべてうまく行きます。サブクラスから呼び出すと、あまりにも多くのパラメータが渡されたとPythonは苦情を言います。

例を示します。 "単純な"メソッドはキーワードargsを使用せず、継承はうまく動作します(私にとっても:-) "KW"メソッドはキーワードargsを使用し、継承はもう機能しません...少なくとも私は差。私は予想通り

class aClass(object): 
    def aSimpleMethod(self, show): 
    print('show: %s' % show) 
    def aKWMethod(self, **kwargs): 
    for kw in kwargs: 
     print('%s: %s' % (kw, kwargs[kw])) 

class aSubClass(aClass): 
    def anotherSimpleMethod(self, show): 
    self.aSimpleMethod(show) 
    def anotherKWMethod(self, **kwargs): 
    self.aKWMethod(kwargs) 

aClass().aSimpleMethod('this') 
aSubClass().anotherSimpleMethod('that') 
aClass().aKWMethod(show='this') 

プリントthisthat、およびthis、。

aSubClass().anotherKWMethod(show='that') 

スローしかし:

一度
self.aKWMethod(**kwargs) 

TypeError: aKWMethod() takes exactly 1 argument (2 given) 

答えて

1

self.aKWMethod(kwargs)を実行すると、(スーパークラスの)aKWMethodメソッドへの単一の位置引数としてキーワード引数の全体を渡します。

self.aKWMethod(**kwargs)に変更し、期待どおりに動作するはずです。

+0

愚かな間違い - マニュアルが時々助けになります!ありがとう! – virtualnobi

1

をあなたがメソッドを呼び出したときに** kwargsからを使用する必要があり、それは、ちょうどキーワード引数を一切位置引数を取りませんそうであれば、正常に動作します。

In [2]: aClass().aSimpleMethod('this') 
    ...: aSubClass().anotherSimpleMethod('that') 
    ...: aClass().aKWMethod(show='this') 
    ...: 
show: this 
show: that 
show: this 
1

最も簡単な言葉で間違っていることを示すために、このエラーは継承とは関係ありません。以下のケースを考えてみましょう:

>>> def f(**kwargs): 
...  pass 
... 
>>> f(a='test') # works fine! 
>>> f('test') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f() takes 0 positional arguments but 1 was given 

ポイントは**kwargsのみキーワード引数を可能にし、位置引数によって置き換えることができないということです。

関連する問題