Python 2.7 超类中带关键字参数的函数:如何从子类访问?

Python 2.7 function with keyword arguments in superclass: how to access from subclass?

关键字参数是否以某种方式在继承方法中进行了特殊处理?

当我使用 class 中定义的关键字参数调用实例方法时,一切顺利。当我从 subclass 调用它时,Python 抱怨传递的参数太多。

举个例子。 "simple" 方法不使用关键字参数,继承工作正常(即使对我来说 :-) "KW" 方法使用关键字参数,继承不再工作......至少我可以看不出区别。

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')

打印 thisthatthis,如我所料。但是

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

投掷:

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

调用方法时需要使用**kwargs,它不需要位置参数,只有关键字参数:

 self.aKWMethod(**kwargs)

一旦你这样做,它工作正常:

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

当您执行 self.aKWMethod(kwargs) 时,您将关键字参数的整个字典作为单个位置参数传递给(超类的)aKWMethod 方法。

将其更改为 self.aKWMethod(**kwargs),它应该会按预期工作。

为了以最简单的方式说明问题所在,请注意此错误与继承无关。考虑以下情况:

>>> 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 只有 允许关键字参数并且不能被位置参数替换。