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')
打印 this
、that
和 this
,如我所料。但是
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
只有 允许关键字参数并且不能被位置参数替换。
关键字参数是否以某种方式在继承方法中进行了特殊处理?
当我使用 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')
打印 this
、that
和 this
,如我所料。但是
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
只有 允许关键字参数并且不能被位置参数替换。