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í.