Clases abstractas vs interfaces en Python
Mucha gente piensa que una interfaz y una clase abstracta son exactamente lo mismo.
En Python técnicamente ambas usan el módulo abc,
pero conceptualmente resuelven problemas distintos.
La gran duda
Si Python no tiene la keyword interface,
entonces… ¿cómo se implementan las interfaces?
La diferencia real
La diferencia no está tanto en la sintaxis, sino en la intención del diseño.
Regla práctica
Clase abstracta → compartir lógica y estado.
Interfaz → definir capacidades o contratos.
Qué es una clase abstracta
Base parcialmente implementadaUna clase abstracta sirve para crear una base común entre varias clases. Puede tener:
- Atributos
- Estado
- Métodos implementados
- Métodos obligatorios
- Lógica compartida
Clase abstracta con estado y comportamiento
Comparte atributos, lógica y obliga a implementar ciertos métodos.
from abc import ABC, abstractmethod
class Vehiculo(ABC):
def __init__(self, velocidad):
self.velocidad = velocidad
def acelerar(self):
self.velocidad += 10
@abstractmethod
def mover(self):
pass
Cómo se simula una interfaz en Python
Solo contratoPython no tiene interfaces reales como Java o C#. Entonces normalmente se usan clases abstractas que solamente contienen métodos abstractos.
Interfaz simulada
No guarda estado ni lógica. Solo define comportamiento esperado.
from abc import ABC, abstractmethod
class Volador(ABC):
@abstractmethod
def volar(self):
pass
Qué significa "estado" de una clase
Datos internosEl estado son los datos que vive guardando el objeto internamente.
Clase con estado
El objeto mantiene datos internos que pueden cambiar.
class CuentaBancaria:
def __init__(self, saldo):
self.saldo = saldo
def depositar(self, monto):
self.saldo += monto
Interfaces y herencia múltiple
Composición de capacidadesUno de los objetivos principales de las interfaces es permitir combinar múltiples capacidades en una misma clase.
Múltiples interfaces
Un objeto puede implementar muchas capacidades distintas.
class Volador(ABC):
@abstractmethod
def volar(self):
pass
class Nadador(ABC):
@abstractmethod
def nadar(self):
pass
class Pato(Volador, Nadador):
def volar(self):
print("Volando")
def nadar(self):
print("Nadando")
Clase abstracta vs interfaz
Diferencia conceptualClase abstracta
- Tiene estado
- Tiene lógica compartida
- Puede tener métodos implementados
- Representa relación fuerte ("es un")
- Comparte estructura común
- Sirve como base real
Interfaz
- No suele tener estado
- No comparte lógica pesada
- Solo define contratos
- Representa capacidades ("puede hacer")
- Permite composición
- Ideal para herencia múltiple
Entonces cuál sería la conclusión correcta
- Abstract Comparte estado, lógica y comportamiento común.
- Interface Define capacidades y contratos esperados.
- Python No tiene interfaces reales. Se simulan usando clases abstractas.
- Diseño La diferencia más importante es conceptual, no sintáctica.
- Clave Clase abstracta = “es un”. Interfaz = “puede hacer”.