Наследование и метод init в Python - PullRequest
64 голосов
/ 02 марта 2011

Я новичок в питоне.Я не могу понять наследование и __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?

Ответы [ 3 ]

108 голосов
/ 02 марта 2011

В первой ситуации 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
24 голосов
/ 02 марта 2011

Когда вы переопределяете init, вы также должны вызывать init родительского класса

super(Num2, self).__init__(num)

Понимание Python super () с помощью методов __init __ ()

3 голосов
/ 27 марта 2011

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

...