这最近让我痛苦了两次(我知道我应该是第一次从我的错误中吸取教训),而且被接受的答案两次都没有帮助过我,所以尽管我脑海中浮现出新的想法,但我想我还是会提交自己的答案,以防万一其他人都会遇到这个问题(或者将来我会再次需要它)。
在我的情况下,问题是我在子类的初始化中传递了一个kwarg,但是在超类中,然后将arg传递给了super()调用。
我始终以以下示例为例,认为这类事情是最好的:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
def some_other_method(self):
raise NotImplementedException
class Bar(Foo):
def some_other_method(self):
print('Do some magic')
Bar(42)
Bar(42, named_optional_param={'xyz': 123})
因此,要解决此问题,我只需要更改我在Foo .__ init__方法中执行操作的顺序即可;例如:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1