Niedawno ugryzło mnie to dwa razy (wiem, że powinienem był wyciągnąć wnioski z mojego błędu za pierwszym razem), a zaakceptowana odpowiedź ani razu mi nie pomogła, więc gdy jest świeża w mojej głowie, pomyślałem, że na wszelki wypadek przedstawię własną odpowiedź ktoś inny wpada w to (lub potrzebuję tego ponownie w przyszłości).
W moim przypadku problemem było to, że przekazywałem kwarg do inicjalizacji podklasy, ale w nadklasie to słowo kluczowe arg było następnie przekazywane do wywołania super ().
Zawsze uważam, że tego typu rzeczy są najlepsze na przykładzie:
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})
Aby rozwiązać ten problem, wystarczy zmienić kolejność wykonywania czynności w metodzie Foo .__ init__; na przykład:
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