I have a base class with a lot of __init__
arguments:
class BaseClass(object):
def __init__(self, a, b, c, d, e, f, ...):
self._a=a+
Unless you are doing something useful in the subclass __init__()
methods, you don't have to override it.
def BaseClass(object):
def __init__(self, a, b, c, d, e, f, ...):
self._a=a+b
self._b=b if b else a
...
def A(BaseClass):
def some_other_method(self):
pass
def B(BaseClass):
pass
Perhaps a clearer implementation for your case is using **kwargs combined with new added arguments in your derived class as in:
class Parent:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
class Child(Parent):
def __init__(self, d, **kwargs):
super(Child, self).__init__(**kwargs)
self.d = d
By this method you avoid the code duplication but preserve the implicit addition of arguments in your derived class.
If the derived classes don't implement anything beyond what the base class __init__()
already does, just omit the derived classes __init__()
methods - the base class __init__()
is then called automatically.
If, OTOH, your derived classes add some extra work in their __init__()
, and you don't want them to explicitly call their base class __init__()
, you can do this:
class BaseClass(object):
def __new__(cls, a, b, c, d, e, f, ...):
new = object.__new__(cls)
new._a=a+b
new._b=b if b else a
...
return new
class A(BaseClass):
''' no __init__() at all here '''
class B(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
''' do stuff with init params specific to B objects '''
Since __new__()
is always called automatically, no further work is required in the derived classes.
Adding a Pythonic implementation. Assuming you want all attributes passed in, you can use the code below. (Can also keep/remove specific kwargs keys if you want a subset).
def A(BaseClass):
def __init__(self, *args, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
base = BaseClass(...)
new = A( **base.__dict__ )
super(SubClass, self).__init__(...)
Consider using *args and **kw if it helps solving your variable nightmare.
In 2.6 and lower version to inherit init from base class, there is no super function, You can inherit below way:
class NewClass():
def __init__():
BaseClass.__init__(self, *args)