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