Una forma más avanzada de implementar abstracción en Python es mediante clases abstractas y métodos abstractos. Estas se utilizan cuando queremos definir una estructura base que otras clases deben seguir, pero sin proporcionar una implementación completa.
¿Qué es una clase abstracta?
Una clase abstracta es una clase que no se puede instanciar directamente y que puede contener uno o más métodos abstractos. Un método abstracto es un método declarado pero no implementado. Su implementación queda delegada a las clases hijas.
Para trabajar con clases abstractas en Python, se utiliza el módulo abc
(Abstract
Base Classes).
Sintaxis básica:
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def hacer_sonido(self):
pass
Aquí, Animal
es una clase abstracta porque hereda de ABC
y contiene un método decorado con @abstractmethod
.
Cualquier clase que herede de Animal
deberá implementar el método hacer_sonido()
o no podrá ser instanciada:
class Perro(Animal):
def hacer_sonido(self):
return "Guau"
class Gato(Animal):
def hacer_sonido(self):
return "Miau"
Intentar instanciar sin implementar:
class Vaca(Animal):
pass
v = Vaca() # Error: Can't instantiate abstract class Vaca with abstract methods hacer_sonido
Uso de super() en clases hijas:
Es posible que una clase abstracta contenga métodos no abstractos (es decir, con implementación), y las subclases pueden reutilizarlos con super()
:
class Vehiculo(ABC):
def encender(self):
print("Vehículo encendido")
@abstractmethod
def moverse(self):
pass
class Auto(Vehiculo):
def moverse(self):
super().encender()
print("El auto se está moviendo.")