113

私はPythonの初心者です。継承とがわかりません__init__()

class Num:
    def __init__(self,num):
        self.n1 = num

class Num2(Num):
    def show(self):
        print self.n1

mynumber = Num2(8)
mynumber.show()

結果:8

これで結構です。しかし、私はに置き換えNum2ます

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2

結果:Error. Num2 has no attribute "n1".

この場合、どのようにNum2アクセスできますn1か?

4

4 に答える 4

176

最初の状況でNum2は、はクラスを拡張していますが、で指定されNumた特別なメソッドを再定義していないため、から継承されます。__init__()Num2Num

クラスがメソッドを定義すると、新しく作成されたクラスインスタンスに対して__init__() クラスのインスタンス化が自動的に呼び出されます。__init__()

2番目の状況では、再定義__init__()しているため、動作を拡張する場合Num2は、スーパークラス()の1つを明示的に呼び出す必要があります。Num

class Num2(Num):
    def __init__(self,num):
        Num.__init__(self,num)
        self.n2 = num*2
于 2011-03-02T11:06:07.430 に答える
41

initをオーバーライドするときは、親クラスのinitも呼び出す必要があります。

super(Num2, self).__init__(num)

__init __()メソッドを使用したPython super()の理解

于 2011-03-02T11:02:29.207 に答える
13

次のようなNum2クラスの簡単な変更:

super().__init__(num) 

python3で動作します。

class Num:
        def __init__(self,num):
                self.n1 = num

class Num2(Num):
        def __init__(self,num):
                super().__init__(num)
                self.n2 = num*2
        def show(self):
                print (self.n1,self.n2)

mynumber = Num2(8)
mynumber.show()
于 2019-12-09T20:01:11.307 に答える
4

を呼び出さないためNum.__init__、フィールド「n1」は作成されません。それを呼んで、それからそれはそこにあります。

于 2011-03-27T17:50:49.713 に答える