- ¿Qué es una clase abstracta?
- Combinar varias abstracciones
- ¿Cuándo usar clases abstractas?
- ¿Qué pasa si no implementamos los métodos abstractos?
- Tabla de conceptos clave
Las clases abstractas son un concepto que facilita la organización de programas con clases e herencia. Imagina que estamos diseñando una aplicación web con varios tipos de elementos HTML, como botones o cuadros de texto. En lugar de repetir código para cada uno, creamos una clase base que sirva como plano general.
Pero, ¿cómo evitamos que alguien cree una instancia de esa clase base directamente, sin usar un elemento específico como un <button> o un <input>? Ahí es donde las clases abstractas juegan un papel crucial.
¿Qué es una clase abstracta?
La clase abstracta es como un molde. No se puede usar directamente para crear objetos, sino que se diseña para ser heredada por otras clases que sí están completas y listas para usarse.
Estas clases también pueden tener métodos abstractos, es decir, métodos que se definen pero no se implementan: simplemente dicen “aquí falta algo que debe completar quien herede esta clase”.
En Python, usamos el módulo abc (Abstract Base Classes) para crear clases abstractas.
Miremos este ejemplo:
from abc import ABC, abstractmethod # Importamos lo necesario para clases abstractas
# Definimos una clase base abstracta
class HTMLElement(ABC):
def __init__(self, attributes={}):
self.attributes = attributes
@abstractmethod
def get_attribute(self, key):
pass # Este método debe ser implementado por las clases hijas
Explicación:
ABCsignifica "Abstract Base Class".- Usamos el decorador
@abstractmethodpara indicar que este métodoget_attributedebe ser programado en los hijos. - Tratamos de crear un
HTMLElementdirectamente y... error. ¡No se puede!
Combinar varias abstracciones
¿Qué pasa si queremos que ciertos métodos específicos como str() (el que convierte objetos en texto) también sean obligatorios?
Podemos combinar varias clases abstractas. Acá un ejemplo:
from abc import ABC, abstractmethod
class Showable(ABC):
@abstractmethod
def __str__(self):
pass # Las clases que hereden esto deben definir __str__
Ahora podemos hacer que HTMLElement también herede de Showable:
class HTMLElement(Showable):
def __init__(self, attributes={}):
self.attributes = attributes
def get_attribute(self, key):
return self.attributes.get(key)
def __str__(self):
return f"HTMLElement con atributos: {self.attributes}"
Este HTMLElement completa todos los métodos requeridos, así que sí se puede usar para crear objetos. Si se omite str, Python lanzará un error cuando intentemos crear una instancia.
¿Cuándo usar clases abstractas?
No siempre las necesitamos. Pero hay situaciones donde son útiles, como:
- Cuando queremos definir una estructura común para varias clases.
- Cuando queremos asegurarnos de que todas las clases hijas sigan ciertas reglas (por ejemplo, que todas tengan el método
str). - Cuando estamos diseñando librerías o componentes reutilizables.
Un ejemplo práctico en el mundo real sería un sistema de archivo donde todos los documentos deben poder guardar e imprimir. Podríamos tener una clase abstracta Documento con métodos guardar() e imprimir() y luego clases hijas como PDF, Word, Excel, etc., cada una con su propia forma de hacer estas acciones.
¿Qué pasa si no implementamos los métodos abstractos?
Es importante saber que si una clase hija no implementa todos los métodos abstractos de su clase madre, no se puede crear una instancia de esa clase. Veamos un ejemplo de lo que NO está completo:
class Boton(HTMLElement):
pass # No implementa __str__, así que Python lanza un error al usar Boton()
Al ejecutar esto, obtendremos un error parecido a:
TypeError: Can't instantiate abstract class Boton with abstract method __str__
Tabla de conceptos clave
| Término | Qué es |
|---|---|
| Clase abstracta | Clase que no puede usarse directamente como objeto |
| Método abstracto | Método sin implementación, debe ser definido por hijos |
ABC |
Clase base para hacer clases abstractas |
@abstractmethod |
Decorador que marca un método como obligatorio |
Resumen
- Una clase abstracta sirve como plano para otras clases, pero no se puede instanciar directamente.
- Usamos el módulo
abcde Python para declarar clases y métodos abstractos. - Los métodos marcados con
@abstractmethoddeben implementarse en las clases hijas. - Si una clase hija no implementa todos los métodos abstractos, Python no permite crear objetos de esa clase.
- Las clases abstractas son útiles para definir estructuras comunes y asegurarse de que todos los componentes siguen un patrón.
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.