4

私は継承が初めてで、継承と Python の super() 関数に関するこれまでの議論はすべて、私の頭を少し超えています。現在、次のコードを使用して親オブジェクトの値を更新しています。

#!/usr/bin/env python
# test.py

class Master(object):
    mydata = []
    def __init__(self):
        s1 = Sub1(self)
        s2 = Sub2(self)

class Sub1(object):
    def __init__(self,p):
        self.p = p
        self.p.mydata.append(1)

class Sub2(object):
    def __init__(self,p):
        self.p = p
        self.p.mydata.append(2)

if __name__ == "__main__":
    m = Master()
    print m.mydata

このコマンド ラインは次のように返します。

user@host:~$ ./test.py
[1, 2]

「自己」参照を子に渡す代わりに、super() でこれを行うより良い方法はありますか?

4

2 に答える 2

4

superクラス継承構造にのみ適用されます。ここで、Sub1Sub2は のサブクラスですMaster

あなたの例では、包含構造を使用してSub1おりSub2、の属性であり、呼び出しMasterには使用できません。super

また、通常、変更可能なリストをクラス属性として使用することは実際には望ましくありません。それに追加すると、インスタンスごとではなく、リストの 1 つのコピー (クラスで定義された) がグローバルに変更されます。Master.__init__代わりにメソッドでリストを開始します。

class Master(object):
    mydata = None
    def __init__(self):
        self.mydata = []

この__init__関数は、新しいインスタンスを設定するために呼び出され、selfそこに新しい空のリストを割り当てることで、各インスタンスが独自のコピーを持つようにします。

于 2011-05-01T15:03:09.583 に答える
3

継承によってそれを行う方法は次のとおりです。最初に親クラスである Master があり、次に Sub1 と Sub2 が Master から継承されてサブクラスになります。すべてのサブクラスは、親クラスのメソッドと変数にアクセスできます。これは、Python の子クラスから親クラスのメソッドを呼び出しますか? の複製である可能性があります。

#!/usr/bin/env python
# test.py

class Master(object):
    mydata = []
    def __init__(self):
        s1 = Sub1()
        s2 = Sub2()

class Sub1(Master):
    def __init__(self):
        super(Sub1, self).mydata.append(1)

class Sub2(Master):
    def __init__(self):
        super(Sub2, self).mydata.append(2)

if __name__ == "__main__":
    m = Master()
    print m.mydata
于 2011-05-01T15:04:08.290 に答える