Existen dos formas de heredar el constructor de la clase padre: usando super
o no.
Lo aconsejable es usar super()
super()
¶class Figura:
def __init__(self, nombre):
self.nombre = nombre
class Rectangulo(Figura):
def __init__(self, base, altura, nombre):
super().__init__(nombre)
self.base = base
self.altura = altura
def area(self):
return self.base * self.altura
rectangulo1 = Rectangulo(100, 300, "rectangulito")
rectangulo1.area()
30000
super()
¶class Figura:
def __init__(self, nombre):
self.nombre = nombre
class Rectangulo(Figura):
def __init__(self, base, altura, nombre):
Figura.__init__(self, nombre)
self.base = base
self.altura = altura
def area(self):
return self.base * self.altura
rectangulo1 = Rectangulo(100, 300, "rectangulito")
rectangulo1.area()
30000
super()
¶Al usar @property evitamos tener que escribir los paréntesis en r.area()
class Rectangulo:
def __init__(self, base, altura):
self.base = base
self.altura = altura
self.nombre = 'rectángulo'
@property
def area(self):
return self.base * self.altura
r = Rectangulo(4,5)
print(r.nombre, r.area)
rectángulo 20
class Cuadrado(Rectangulo):
def __init__(self, lado):
Rectangulo.__init__(self, lado, lado)
self.nombre = 'cuadrado'
c = Cuadrado(4)
print(c.nombre, c.area)
cuadrado 16
super()
¶class SuperCuadrado(Rectangulo):
def __init__(self, lado):
super().__init__(lado, lado)
self.nombre = 'cuadrado'
c2 = SuperCuadrado(5)
print(c2.nombre, c2.area)
cuadrado 25
super()
¶class Person(object):
def __init__(self,fname='', lname=''):
self.fname = fname
self.lname = lname
def __repr__(self): # permite representar un objeto para mostrarlo como mejor nos parezca
return f"Se trata de {self.fname} de la familia {self.lname}."
def __str__(self):
return f"Persona: {self.fname} {self.lname}."
class Student(Person):
def __init__(self, fname='', lname='', id=''):
Person.__init__(self, fname, lname)
self.id = id
def __repr__(self): # permite representar un objeto para mostrarlo como mejor nos parezca
return f"El id {self.id} corresponde al estudiente: {self.fname} {self.lname}."
def __str__(self):
return f"Estudiante: {self.fname} {self.lname} con id: {self.id}."
if __name__ == '__main__':
p = Person('Miguel', 'Ruiz')
print(p) # equivale a: print(str(p))
print(repr(p),"\n")
s= Student('Ana', 'Perez', 'A001')
print(s) # equivale a: print(str(s))
print(repr(s))
Persona: Miguel Ruiz. Se trata de Miguel de la familia Ruiz. Estudiante: Ana Perez con id: A001. El id A001 corresponde al estudiente: Ana Perez.
super()
¶class Person(object):
def __init__(self,fname='', lname=''):
self.fname = fname
self.lname = lname
def __repr__(self): # permite representar un objeto para mostrarlo como mejor nos parezca
return f"Se trata de {self.fname} de la familia {self.lname}."
def __str__(self):
return f"Persona: {self.fname} {self.lname}."
class Student(Person):
def __init__(self, fname='', lname='', id=''):
super().__init__(fname, lname) # IMPORTANTE: no lleva self pero si lleva los demás argumentos
self.id = id
def __repr__(self): # permite representar un objeto para mostrarlo como mejor nos parezca
return f"El id {self.id} corresponde al estudiente: {self.fname} {self.lname}."
def __str__(self):
return f"Estudiante: {self.fname} {self.lname} con id: {self.id}."
if __name__ == '__main__':
p = Person('Miguel', 'Ruiz')
print(p) # equivale a: print(str(p))
print(repr(p),"\n")
s= Student('Ana', 'Perez', 'A001')
print(s) # equivale a: print(str(s))
print(repr(s))
Persona: Miguel Ruiz. Se trata de Miguel de la familia Ruiz. Estudiante: Ana Perez con id: A001. El id A001 corresponde al estudiente: Ana Perez.
¿Hay alguna diferencia entre usar Base.__init__
y super().__init__
?
class Base():
def __init__(self):
print("Base created")
class ChildA(Base):
def __init__(self):
Base.__init__(self)
class ChildB(Base):
def __init__(self):
super().__init__()
ChildA()
ChildB()
print()
Base created Base created
Sin super()
, estaríamos limitados al usar toda la capacidad de la herencia múltiple porque estaríamos conectando rigidamente con la clase padre.
Use siempre super
para hacer referencia a la clase principal en lugar de codificarla.
Lo que pretende es hacer referencia a la clase principal que es la siguiente en la línea, no específicamente de la que ve que hereda el hijo.