2

私は次のような構造を持っています

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

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

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

class D(B,C):
    def __init__(self, x):
        self.d=x

__init__ここで、とが両方BCも呼び出されるようにsを拡張したいと思いAます(BとCはスタンドアロンクラスとして使用できます)。さらにD、A、B、およびCを呼び出す必要があります(DはBとCの機能を組み合わせていますが、すべての初期化を実行する必要があります)。すべて__init__同じパラメータを取ります。明らかに、Aは1回だけ呼び出す必要があります。

あなたはそれをする簡単な方法を見ますか?

4

2 に答える 2

6

を使用しsuperます。私の知る限り、これが目的です...

まず、いくつかの提案された読書:

  • スーパーは有害スーパーと見なされます(同時に-さまざまな人々によって)

次に、例:

class A(object):
    def __init__(self, x):
        print "Called A"
        self.a=x

class B(A):
    def __init__(self, x):
        print "Called B"
        super(B,self).__init__(x)
        self.b=x

class C(A):
    def __init__(self, x):
        print "Called C"
        super(C,self).__init__(x)
        self.c=x

class D(B,C):
    def __init__(self, x):
        print "Called D"
        super(D,self).__init__(x)        
        self.d=x


foo = D(10)

コメントで述べられているように、スーパー定義を使用して任意の数の位置引数とキーワード引数を受け入れるメソッドがよく見られます。

def mymethod(self,*args,**kwargs):
    super(thisclass,self).method(*args,**kwargs)
    ...

これによりsuper、必要な/不要な引数を継承チェーン内の他のオブジェクトに渡すことができます。superこれらのメソッドは、必要な引数を決定し、残りを無視することができます(もちろん次の引数に渡します)


最後に、この説明を完了するには、python2.xとpython3.xについて説明する必要があります。python2.xでは、すべてのクラスが新しいスタイルである必要があります(object最終的には継承する必要があります)。python3.xでは、これは自動です。また、python3.xでは、への引数を省略できますsuper

 super().__init__(*args,**kwargs)

super()ただし、python2.xとpython3.xの両方で機能するため、python2.xスタイルを好みます。また、 (python3.xスタイル)が基になるメソッドに渡すオブジェクトをどのように知っているのか、常に疑問に思っていますself。私にはpython2.xバージョンよりもはるかに魔法のようです...

于 2012-11-08T21:05:10.350 に答える
2

使用するsuper

class D(B, C):
    def __init__(self, *args, **kwargs):
        super(D, self).__init__(*args, **kwargs)
        self.d = args[0]

ここでスーパーについてのいくつかの説明関連する質問

Python 2では、から継承しobjectて新しいスタイルクラスを使用し、他のクラスにも追加する必要がありsuperます。

于 2012-11-08T21:11:09.607 に答える