私は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
?
最初の状況では、_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
_
Initをオーバーライドするときは、親クラスのinitも呼び出す必要があります
super(Num2, self).__init__(num)
Num.__init__
を呼び出さないため、フィールド「n1」は作成されません。それを呼び出して、それはそこにあります。