Herencia y método init en Python.

Soy principiante de python. No puedo entender la herencia y __init__() .

 class Num: def __init__(self,num): self.n1 = num class Num2(Num): def show(self): print self.n1 mynumber = Num2(8) mynumber.show() 

RESULTADO: 8

Esto esta bien. Pero reemplazo Num2 con

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

RESULTADO: Error. Num2 has no attribute "n1". Error. Num2 has no attribute "n1".

En este caso, ¿cómo puede Num2 acceder a n1 ?

En la primera situación, Num2 está extendiendo la clase Num y como no está redefiniendo el método especial llamado __init__() en Num2 , se hereda de Num .

Cuando una clase define un __init__() , la __init__() instancias de clase invoca automáticamente __init__() para la instancia de clase recién creada.

En la segunda situación, ya que está redefiniendo __init__() en Num2 , debe llamar explícitamente al de la súper clase ( Num ) si desea extender su comportamiento.

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

Cuando reemplaza el init, también tiene que llamar al init de la clase padre

 super(Num2, self).__init__(num) 

Entendiendo Python super () con __init __ () métodos

Como no llama a Num.__init__ , el campo “n1” nunca se crea. Llámalo y entonces estará allí.