Dies hat mich in letzter Zeit zweimal gebissen (ich weiß, ich hätte beim ersten Mal aus meinem Fehler lernen sollen) und die akzeptierte Antwort hat mir auch nicht geholfen. Während es in meinem Kopf frisch ist, dachte ich, ich würde meine eigene Antwort für alle Fälle einreichen jemand anderes stößt darauf (oder ich brauche das in Zukunft wieder).
In meinem Fall bestand das Problem darin, dass ich ein kwarg an die Initialisierung der Unterklasse übergeben habe, aber in der Oberklasse wurde dieses Schlüsselwort arg dann an den Aufruf von super () übergeben.
Ich denke immer, dass diese Art von Dingen am besten mit einem Beispiel ist:
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
Um dies zu beheben, muss ich nur die Reihenfolge ändern, in der ich Dinge in der Foo .__ init__ -Methode mache. z.B:
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