这让我最近两次被咬(我知道我应该第一次从错误中吸取教训)并且接受的答案两次都没有帮助我,所以当我脑海中浮现时我想我会提交我自己的答案以防万一其他任何人都遇到了这个问题(或者我将来再次需要这个)。
在我的情况下,问题是我将 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) # no error
Bar(42, named_optional_param={'xyz': 123}) # raises TypeError: object.__init__() takes no parameters
所以要解决这个问题,我只需要改变我在 Foo.__init__ 方法中做事的顺序;例如:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
# call super only AFTER poping the kwargs
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1