32

私は、いくつかのより高度な python の主題に飛び込んでいます (まあ、少なくとも私には高度です)。現在、多重継承と super() の使用方法について読んでいます。スーパー関数の使い方はだいたい理解できたのですが、(1) こうやってただやって何が悪いの?:

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        First.__init__(self)
        Second.__init__(self)
        print "that's it"

super() については、Python Warts に関する Andrew Kuchlings の論文に次のように書かれています。

派生クラスが複数の基本クラスから継承し、それらの一部またはすべてにinit メソッドがある場合、super() の使用も正しくなります。

そこで、上記の例を次のように書き直しました。

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        super(Third, self).__init__(self)
        print "that's it"

ただし、これは、最初に見つかったinitのみを実行しFirstます。(2) super()init の fromFirstとの両方を実行するために使用できSecondます。super(Third, self).__init__(self)2 回実行すると、最初に実行されます。init () を 2 回..

さらに混乱を加えるために。継承されたクラスのinit () 関数が異なる引数を取るとどうなるでしょうか。たとえば、次のようなものがあるとします。

class First(object):
    def __init__(self, x):
        print "first"

class Second(object):
    def __init__(self, y, z):
        print "second"

class Third(First, Second):
    def __init__(self, x, y, z):
        First.__init__(self, x)
        Second.__init__(self, y, z)
        print "that's it"

(3) super() を使用して、継承されたさまざまなクラスの初期化関数に関連する引数をどのように提供できますか?

すべてのヒントは大歓迎です!

ps。いくつか質問があるので、それらを太字にして番号を付けました..

4

2 に答える 2

12

質問 2 では、各クラスで super を呼び出す必要があります。

class First(object):
    def __init__(self):
        super(First, self).__init__()
        print "first"

class Second(object):
    def __init__(self):
        super(Second, self).__init__()
        print "second"

class Third(First, Second):
    def __init__(self):
        super(Third, self).__init__()
        print "that's it"

質問 3 については、それはできません。メソッドには同じ署名が必要です。ただし、親クラスの一部のパラメーターを無視するか、キーワード引数を使用することもできます。

于 2013-05-31T10:51:22.130 に答える