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__ )