クラス階層とコンストラクタは関連しています。子クラスのパラメータを親に渡す必要があります。Pythonでのコンストラクタの特殊化
だから、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は、子コンストラクタ内で、親にsuper()を呼び出し、親コンストラクタで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')
これは残念ながらKDに割り当てられた4、5、6エンドまで、KE、KF以来、動作しません。
上記を達成するためのエレガントなpythonパターンはありますか?
どのように機能しますか?どういうわけか、私はより優雅さの可能性がどこに来るか見ていない。 –