Подтвердить что ты не робот

Наследование и метод 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?

4b9b3361

Ответ 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

Ответ 3

Поскольку вы не вызываете Num.__init__, поле "n1" никогда не создается. Позвоните, а затем он будет там.