Python:inheritance超类__init__

我有一个很多__init__参数的基类:

 def BaseClass(object): def __init__(self, a, b, c, d, e, f, ...): self._a=a+b self._b=b if b else a ... 

所有的inheritance类都应该运行基类的__init__方法。

我可以在每个要调用超类__init__的inheritance类中写一个__init__()方法,但这会是一个严重的代码重复:

 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, ...) ... 

什么是自动调用超类__init__最Python的方法?

 super(SubClass, self).__init__(...) 

考虑使用* args和** kw,如果它有助于解决你的variables噩梦。

你必须明确地写下来,但另一方面,如果你有很多的参数,你应该使用* args作为位置参数,** kwargs作为关键字参数。

 class SubClass(BaseClass): def __init__(self, *args, **kwargs): super(SubClass, self).__init__(*args, **kwargs) # SubClass initialization code 

你可以使用的另一种技术是最小化init中的代码,然后在init函数结束时调用另一个自定义函数。 然后在子类中,您只需要重写自定义函数

 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 ... 

如果派生类没有实现超出基类__init__()已经做的任何事情,只要省略派生类__init__()方法 – 然后自动调用基类__init__()

如果OTOH,你的派生类在__init__()增加了一些额外的工作,而你不希望它们明确地调用它们的基类__init__() ,你可以这样做:

 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 ''' 

由于__new__()总是自动调用,因此在派生类中不需要做进一步的工作。

除非你在子类__init__()方法中做了一些有用的事情,否则你不必重写它。

 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 

在2.6及更低版本中,从基类inheritanceinit,没有超级函数,你可以inheritance下面的方法:

 class NewClass(): def __init__(): BaseClass.__init__(self, *args) 

添加Pythonic实现。 假设你想传入所有的属性,你可以使用下面的代码。 (如果你想要一个子集,也可以保留/删除特定的kwargs键)。

 def A(BaseClass): def __init__(self, *args, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) base = BaseClass(...) new = A( **base.__dict__ )