クラス階層とコンストラクターは関連しています。子クラスからのパラメーターは、親に渡す必要があります。
したがって、Python では、次のようになります。
class Parent(object):
def __init__(self, a, b, c, ka=None, kb=None, kc=None):
# do something with a, b, c, ka, kb, kc
class Child(Parent):
def __init__(self, a, b, c, d, e, f, ka=None, kb=None, kc=None, kd=None, ke=None, kf=None):
super(Child, self).__init__(a, b, c, ka=ka, kb=kb, kc=kc)
# do something with d, e, f, kd, ke, kf
多数の子クラスと多数のパラメーターがあると想像してください。新しいパラメータを追加するのは非常に面倒です。
もちろん、名前付きパラメーターを完全に省略して *args と **kwargs を使用することもできますが、それではメソッド宣言があいまいになります。
Python (2.6) でこれをエレガントに処理するためのパターンはありますか?
「エレガントに」とは、パラメーターの出現回数を減らしたいという意味です。a、b、c、ka、kb、kc はすべて、Child コンストラクター、Parent への super() 呼び出し、および Parent コンストラクターで 3 回出現します。
理想的には、親のinitのパラメーターを一度指定し、子のinitでは追加のパラメーターのみを指定したいと思います。
私はこのようなことをしたいと思います:
class Parent(object):
def __init__(self, a, b, c, ka=None, kb=None, kc=None):
print 'Parent: ', a, b, c, ka, kb, kc
class Child(Parent):
def __init__(self, d, e, f, kd='d', ke='e', kf='f', *args, **kwargs):
super(Child, self).__init__(*args, **kwargs)
print 'Child: ', d, e, f, kd, ke, kf
x = Child(1, 2, 3, 4, 5, 6, ka='a', kb='b', kc='c', kd='d', ke='e', kf='f')
残念ながら、4、5、6 が kd、ke、kf に割り当てられるため、これは機能しません。
上記を達成するためのエレガントなpythonパターンはありますか?