web-dev-qa-db-fra.com

Héritage et méthode init in Python

Je suis débutant en python. Je ne comprends pas l'héritage et __init__().

class Num:
    def __init__(self,num):
        self.n1 = num

class Num2(Num):
    def show(self):
        print self.n1

mynumber = Num2(8)
mynumber.show()

RÉSULTAT: 8

C'est acceptable. Mais je remplace Num2 Par

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2

RÉSULTAT: Error. Num2 has no attribute "n1".

Dans ce cas, comment Num2 Peut-il accéder à n1?

65
Yugo Kamo

Dans le premier cas, Num2 Étend la classe Num et comme vous ne redéfinissez pas la méthode spéciale nommée __init__() dans Num2, Elle est héritée de Num.

Lorsqu'une classe définit une méthode __init__(), l'instanciation de classe appelle automatiquement __init__() pour l'instance de classe nouvellement créée.

Dans le second cas, puisque vous redéfinissez __init__() dans Num2, Vous devez appeler explicitement celui de la super classe (Num) si vous souhaitez étendre son comportement.

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

Lorsque vous remplacez init, vous devez également appeler init de la classe parente.

super(Num2, self).__init__(num)

Comprendre Python super () avec les méthodes __init __ ()

24
Mauro Rocco

Puisque vous n'appelez pas Num.__init__, le champ "n1" n'est jamais créé. Appelez-le et ce sera là.

3