Ejemplo
Vamos a armar un ejemplo completo y realista de herencia múltiple, uso de super()
, y clases abstractas, simulando un sistema para personajes de videojuegos.
Imaginemos que tenemos un personaje que puede ser tanto Guerrero como Mago, y queremos combinar comportamientos.
⚔️🧙 Ejemplo: PersonajeJugador
hereda de Guerrero
y Mago
Paso 1: Creamos una clase base abstracta Personaje
from abc import ABC, abstractmethod
class Personaje(ABC):
def __init__(self, nombre, nivel):
self.nombre = nombre
self.nivel = nivel
@abstractmethod
def atacar(self):
pass
def mostrar_info(self):
print(f"{self.nombre} - Nivel {self.nivel}")
Paso 2: Clases Guerrero
y Mago
que heredan de Personaje
class Guerrero(Personaje):
def __init__(self, nombre, nivel, fuerza):
super().__init__(nombre, nivel)
self.fuerza = fuerza
def atacar(self):
print(f"{self.nombre} ataca con espada (Fuerza {self.fuerza})")
class Mago(Personaje):
def __init__(self, nombre, nivel, poder_magico):
super().__init__(nombre, nivel)
self.poder_magico = poder_magico
def lanzar_hechizo(self):
print(f"{self.nombre} lanza un hechizo (Poder mágico {self.poder_magico})")
def atacar(self):
print(f"{self.nombre} ataca con magia (Poder mágico {self.poder_magico})")
Paso 3: Clase que hereda de Guerrero y Mago
class PersonajeJugador(Guerrero, Mago):
def __init__(self, nombre, nivel, fuerza, poder_magico):
# Llamamos a __init__ de Guerrero, que ya llama al de Personaje
Guerrero.__init__(self, nombre, nivel, fuerza)
Mago.__init__(self, nombre, nivel, poder_magico)
def atacar(self):
print(f"{self.nombre} ataca combinando espada y magia!")
print(f"- Fuerza: {self.fuerza}")
print(f"- Poder mágico: {self.poder_magico}")
✅ Uso del sistema
pj = PersonajeJugador("Arthas", 10, fuerza=50, poder_magico=80)
pj.mostrar_info()
pj.atacar()
pj.lanzar_hechizo() # método exclusivo del mago
🧠 Notas importantes
PersonajeJugador
hereda de dos clases concretas.- Ambas clases (
Guerrero
yMago
) heredan de la clase abstractaPersonaje
. - En el constructor de
PersonajeJugador
, llamamos manualmente a los constructores deGuerrero
yMago
. - Si ambas usaran
super()
, podríamos usar herencia en cadena con MRO, pero en este ejemplo controlamos cada inicialización.
Opcional: Mostrar el orden MRO
print(PersonajeJugador.__mro__)