Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Clases abstractas Python: Profundizando en las clases

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:

  • ABC significa "Abstract Base Class".
  • Usamos el decorador @abstractmethod para indicar que este método get_attribute debe ser programado en los hijos.
  • Tratamos de crear un HTMLElement directamente 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 abc de Python para declarar clases y métodos abstractos.
  • Los métodos marcados con @abstractmethod deben 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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY