1. ホーム
  2. python

python の多重継承 super を使ったコンストラクタへの引数渡し

2023-08-13 09:54:24

質問

次のようなpythonのコードの断片を考えてみましょう。

class A(object):
    def __init__(self, a):
        self.a = a

class B(A):
    def __init__(self, a, b):
        super(B, self).__init__(a)
        self.b = b

class C(A):
    def __init__(self, a, c):
        super(C, self).__init__(a)
        self.c = c

class D(B, C):
    def __init__(self, a, b, c, d):
        #super(D,self).__init__(a, b, c) ???
        self.d = d

私は、どのようにすれば a , bc を対応する基底クラスのコンストラクタに追加します。

どのように解決するのですか?

さて、一般に多重継承を扱う場合、ベースクラスは(残念ながら) 多重継承のために設計された . クラス BC を適用する適切な方法を見つけられませんでした。 superD .

多重継承のための基底クラスを設計する一般的な方法の1つは、中間レベルの基底クラスがその __init__ メソッドで余分な引数を受け取り、その引数を super の呼び出しに渡します。

pythonで行う方法の一つを紹介します。

class A(object):
    def __init__(self,a):
        self.a=a

class B(A):
    def __init__(self,b,**kw):
        self.b=b
        super(B,self).__init__(**kw)

 class C(A):
    def __init__(self,c,**kw):
        self.c=c
        super(C,self).__init__(**kw)

class D(B,C):
    def __init__(self,a,b,c,d):
        super(D,self).__init__(a=a,b=b,c=c)
        self.d=d

これは残念なことだとも捉えられるが、それはそれで仕方がない。