web-dev-qa-db-ja.com

Pythonの継承とinitメソッド

私は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

65
Yugo Kamo

最初の状況では、_Num2_はクラスNumを拡張し、__init__()という名前の特別なメソッドを_Num2_で再定義していないため、Num

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

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

_class Num2(Num):
    def __init__(self,num):
        Num.__init__(self,num)
        self.n2 = num*2
_
109
Mario Duarte

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

super(Num2, self).__init__(num)

理解Python super()with __init __()methods

24
Mauro Rocco

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

3