El uso de la herencia en Python con super()
Capítulo 7: Herencia de clases - cómo utilizar super() - POO Python
Seguimos con la herencia de clases. Esta vez, te enseño a importar cosas de la superclase con super().
Es importante que veas el vídeo para poder entender a la perfección este tema.
Mira el siguiente código. Tenemos tres clases, Usuarios, UsuariosPremium y UsuariosPremiumPlus.
class Usuarios:
tipo_usuario = "Free"
publicidad = True
def __init__(self, nid, alias, nombre, apellidos):
self.nid = nid
self.alias = alias
self.nombre = nombre
self.apellidos = apellidos
def muestra_datos(self):
print("El nombre y los apellidos del usuario son: " + self.nombre, self.apellidos)
print("El ID de usuario es: " + self.nid + ".")
print("El alias del usuario es: " + self.alias + ".")
class UsuariosPremium:
tipo_usuario = "Premium"
publicidad = False
participacion_sorteos = 10
class UsuariosPremiumPlus(UsuariosPremium):
participacion_sorteos = 25
De estas clases, es muy importante que sepas de qué clase hereda cada una.
La subclase UsuariosPremium hereda de la superclase Usuarios. La subclase UsuariosPremiumPlus hereda de su superclase UsuariosPremium, no de Usuarios.
Reemplazar herencia del método __init__ en Python
Se puede poner un __init__
en una subclase. Pero como ya sabes, los métodos se sobrescriben con la herencia, es decir, un __init__
en la subclase UsuariosPremium, va a hacer que el otro de la superclase se sobrescriba en su herencia. Por lo que quiere decir, que cada clase puede tener herencia, pero conservar los métodos y atributos propios que se deseen.
class UsuariosPremium:
def __init__(self, participacion_sorteos, puntos_premios):
self.participacion_sorteos = participacion_sorteos
self.puntos_premios = puntos_premios
self.contenido_premium = True
Esto es un problema, ya que nos va a sobrescribir todo el método __init__ y yo lo que quiero es que se puedan aprovechar todo el método __init__ de la clase Usuarios y además utilizar los de esta clase (UsuariosPremium). Para poder utilizar características del __init__ de Usuarios y las propias de UsuariosPremium lo puedes hacer utilizando super().
Aquí tienes un ejemplo:
class UsuariosPremium:
def __init__(self, participacion_sorteos, puntos_premios):
self.participacion_sorteos = participacion_sorteos
self.puntos_premios = puntos_premios
self.contenido_premium = True
super().__init__(nid, alias, nombre, apellidos)
Con esta última línea estoy añadiendo en una línea todo lo que quiero del método __init__ de la clase Usuarios que ha sido reescrito al declarar un método __init__ en UsuariosPremium.
Comentarios
Si te quedan dudas sobre el temario, sobre Python, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.