Python: Inherit the superclass __init__

前端 未结 7 895
囚心锁ツ
囚心锁ツ 2020-12-01 02:51

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+         


        
相关标签:
7条回答
  • 2020-12-01 02:57

    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
    
    0 讨论(0)
  • 2020-12-01 03:02

    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.

    0 讨论(0)
  • 2020-12-01 03:04

    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.

    0 讨论(0)
  • 2020-12-01 03:09

    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__ )
    
    0 讨论(0)
  • 2020-12-01 03:11
    super(SubClass, self).__init__(...)
    

    Consider using *args and **kw if it helps solving your variable nightmare.

    0 讨论(0)
  • 2020-12-01 03:15

    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)
    
    0 讨论(0)
提交回复
热议问题