Python: Inherit the superclass __init__
我有一个包含很多
1 2 3 4 5 | def BaseClass(object): def __init__(self, a, b, c, d, e, f, ...): self._a=a+b self._b=b if b else a ... |
所有继承类都应该运行基类的
我可以在每个将调用超类
1 2 3 4 5 6 7 8 9 10 11 12 13 | def A(BaseClass): def __init__(self, a, b, c, d, e, f, ...): super(A, self).__init__(a, b, c, d, e, f, ...) def B(BaseClass): def __init__(self, a, b, c, d, e, f, ...): super(A, self).__init__(a, b, c, d, e, f, ...) def C(BaseClass): def __init__(self, a, b, c, d, e, f, ...): super(A, self).__init__(a, b, c, d, e, f, ...) ... |
号
自动调用超类
1 | super(SubClass, self).__init__(...) |
考虑使用*args和**kw,如果它有助于解决变量噩梦。
您必须显式地编写它,但另一方面,如果您有很多参数,您可能应该使用*args作为位置参数,使用**kwargs作为关键字参数。
1 2 3 4 | class SubClass(BaseClass): def __init__(self, *args, **kwargs): super(SubClass, self).__init__(*args, **kwargs) # SubClass initialization code |
号
您可以使用的另一种技术是最小化init中的代码,然后在init函数结束时调用另一个自定义函数。然后在子类中,只需要重写自定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class BaseClass(object): def __init__(self, *args, **kwargs): # initialization code self._a = kwargs.get('a') ... # custom code for subclass to override self.load() def load(): pass class SubClass(BaseClass) def load(): # SubClass initialization code ... |
如果派生类没有实现任何超出基类
如果您的派生类在它们的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 ''' |
由于
除非您在子类
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
。
也许更清晰的实现是在派生类中使用**Kwargs和新添加的参数,如:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
通过此方法,可以避免代码重复,但保留派生类中隐式添加的参数。
在2.6及更低版本中,要从基类继承init,没有super函数,可以通过以下方式继承:
1 2 3 | class NewClass(): def __init__(): BaseClass.__init__(self, *args) |
。
添加pythonic实现。假设您希望传入所有属性,则可以使用下面的代码。(如果需要子集,还可以保留/删除特定的Kwargs键)。
1 2 3 4 5 6 7 | def A(BaseClass): def __init__(self, *args, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) base = BaseClass(...) new = A( **base.__dict__ ) |
。