how to pass arguments efficiently (**kwargs in python)
inheritance, keyword-argument, python
Solution
Your problem is that you only tried to use `super` in the child class.
If you use `super` in the base classes too, then this will work. Each constructor will "eat" the keyword arguments it takes and not pass them up to the next constructor. When the constructor for `object` is called, if there are any keyword arguments left over it will raise an exception.
class FirstBase(object):
def __init__(self, detail_text=None, backed_object=None,
window=None, droppable_zone_obj=None,
bound_zone_obj=None, on_drag_opacity=None, **kwargs):
super(FirstBase, self).__init__(**kwargs)
class SecondBase(object):
def __init__(self, size=(0,0), texture=None, desc="",
backed_object=None, window=None, **kwargs):
super(SecondBase, self).__init__(**kwargs)
class Child(FirstBase, SecondBase):
def __init__(self, **kwargs):
super(Child, self).__init__(**kwargs)
As you can see, it works, except when you pass a bogus keyword argument:
>>> Child()
<__main__.Child object at 0x7f4aef413bd0>
>>> Child(detail_text="abc")
<__main__.Child object at 0x7f4aef413cd0>
>>> Child(bogus_kw=123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 14, in __init__
super(Child, self).__init__(**kwargs)
File "test.py", line 5, in __init__
super(FirstBase, self).__init__(**kwargs)
File "test.py", line 10, in __init__
super(SecondBase, self).__init__(**kwargs)
TypeError: object.__init__() takes no parameters
Problem
I have a class that inherits from 2 other classes. These are the base classes: ``` class FirstBase(object): def __init__(self, detail_text=desc, backed_object=backed_object, window=window, droppable_zone_obj=droppable_zone_obj, bound_zone_obj=bound_zone_object, on_drag_opacity=on_drag_opacity): # bla bla bla class SecondBase(object): def __init__(self, size, texture, desc, backed_object, window): # bla bla bla ``` And this is the child: ``` class Child(FirstBase, SecondBase): """ this contructor doesnt work def __init__(self, **kwargs): # PROBLEM HERE #super(Child, self).__init__(**kwargs) """ #have to do it this TERRIBLE WAY def __init__(self, size=(0,0), texture=None, desc="", backed_object=None, window=None, droppable_zone_obj=[], bound_zone_object=[], on_drag_opacity=1.0): FirstBase.__init__(self, detail_text=desc, backed_object=backed_object, window=window, droppable_zone_obj=droppable_zone_obj, bound_zone_obj=bound_zone_object, on_drag_opacity=on_drag_opacity) SecondBase.__init__(self, size, texture, desc, backed_object, window) ``` I wanted to solve it all nicely with `**kwargs` but when I call the first commented out constructor I get `TypeError: __init__() got an unexpected keyword argument 'size'`. Any ideas how I can make it work with `**kwargs?`