Pythonでの多重継承では、すべてのクラスが協調して動作する必要があります。この場合、各クラスの__init__
メソッドに任意の**kwargs
を受け入れ、super().__init__
を呼び出すとそれらを渡すことで、それらを連携させることができます。あなたの例のクラス階層については
、あなたはこのような何か行うことができます:あなたは(というself.a
などを使用するよりも)直接引数の値を使用するようにD
を望んでいた場合、あなたは両方取ることができることを
class A(object):
__init__(self,a): # Don't accept **kwargs here! Any extra arguments are an error!
self.a=a
class B(A):
__init__(self, b, **kwargs): # only name the arg we care about (the rest go in **kwargs)
super(B, self).__init__(**kwargs) # pass on the other keyword args
self.b=b
class C(A):
__init__(self, c1, c2, **kwargs):
super(C,self).__init__(**kwargs)
self.c1=c1
self.c2=c2
class D(B,C)
__init__(self, d, **kwargs):
super(D,self).__init__(**kwargs)
self.d=d
self.dd=self.a+self.b+2*self.c1+5*self.c2+3*self.d
は注意を名前付き引数とまだsuper()
コールにそれらを渡し、それら:親クラスのいくつかは、彼らのorigiで(引数を保存しない場合
class D(B,C)
__init__(self,a, b, c1, c2, d, **kwargs): # **kwargs in case there's further inheritance
super(D,self).__init__(a=a, b=b, c1=c1, c2=c2, **kwargs)
self.d = d
self.dd = a + b + 2 * c1 + 5 * c2 + 3 * d # no `self` needed in this expression!
いくつかの引数に受け入れ、合格することが重要ですこれらの値が必要です。このコードスタイルを使用して、一部の引数(たとえば、super(D, self).__init__(a=a, b=b, c1=2*c1, c2=5*c2, **kwargs)
)の変更された値を渡すこともできます。
さまざまな引数を使用したこの種のコラボレーション多重継承は、位置引数を使用して作業を行うことはほとんど不可能です。ただし、キーワード引数を使用すると、呼び出しの名前と値の順序は関係ありません。したがって、名前付き引数と**kwargs
を同時に渡すのは簡単です。 *args
を使用するとうまくいきません(最近のPython 3のバージョンでは、で関数を呼び出す方法の柔軟性が増します(例えば、1回の呼び出しで複数のアンパックを許可するなど)。f(*foo, bar, *baz)
)。
あなたが明示的に引数をsuper
に渡しているので、Python 3を使用していた場合は、コラボレーション関数の引数を「キーワードのみ」にすることができます。混在し、あなたのメソッドを位置引数で呼び出そうとしています。 *
を他の名前付き引数の前の引数リストに入れてください:def __init__(self, *, c1, c2, **kwargs):
。
@ Karinのコメントありがとうございましたが、ここでの質問は異なっており、よりオープンです。 –