Наследование и метод 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
?
Ответы
Ответ 1
В первой ситуации Num2
расширяет класс Num
, и поскольку вы не переопределяете специальный метод с именем __init__()
в Num2
, он наследуется от Num
.
Когда класс определяет __init__()
метод, экземпляр класса автоматически вызывает __init__()
для вновь созданный экземпляр класса.
Во второй ситуации, поскольку вы переопределяете __init__()
в Num2
, вам нужно явно вызвать одно из суперкласса (Num
), если вы хотите расширить его поведение.
class Num2(Num):
def __init__(self,num):
Num.__init__(self,num)
self.n2 = num*2
Ответ 2
Когда вы переопределяете init, вы также должны вызвать init родительского класса
super(Num2, self).__init__(num)
Понимание Python super() с методами __init __()
Ответ 3
Поскольку вы не вызываете Num.__init__
, поле "n1" никогда не создается. Позвоните, а затем он будет там.