Ir al contenido principal

Clases abstractas en Python: Una guía completa con ejemplos

Aprende sobre las clases abstractas de Python, su finalidad y cómo utilizar el módulo `abc` para aplicar interfaces coherentes. Incluye ejemplos prácticos y mejores prácticas para una implementación eficaz.
Actualizado 8 sept 2025  · 10 min de lectura

Un componente clave del desarrollo de software moderno es la programación orientada a objetos (OOP), que ofrece a los programadores la capacidad de organizar el código de forma escalable, modular y reutilizable. Las clases abstractas son uno de los numerosos conceptos de la programación orientada a objetos (OOP) que son esenciales para crear una plantilla que puedan utilizar otras clases. En esta publicación se explicarán las clases abstractas, sus ventajas y cómo utilizar el módulo abc de Python para crearlas correctamente.

Si eres nuevo en Python, puedes aprender a trabajar con módulos y paquetes, trabajar con tipos de datos integrados y escribir funciones personalizadas con nuestro programa de formación. 

¿Qué es una clase abstracta?

Una clase abstracta es como una plantilla para otras clases. Define métodos que deben incluirse en cualquier clase que herede de ella, pero no proporciona el código real para esos métodos.

Piensa en ello como una receta sin ingredientes específicos:te indica los pasos a seguir, pero los detalles dependen de la subclase.

Ejemplo:

Supongamos que estás creando un programa para calcular el área de diferentes formas.

  1. Creas una clase abstracta llamada Shape que establece que todas las formas deben tener un método area().
  2. Pero Shape no define cómo funciona area(), ya que la fórmula depende del tipo de forma.
  3. Cada forma específica (como Circle o Rectangle) hereda de Shape y proporciona su propia versión de area().

Si deseas obtener más información sobre los conceptos clave de Python, puedes inscribirte en nuestro curso de Programación orientada a objetos en Python (nivel intermedio ). 

¿Por qué utilizar clases abstractas en Python?

Las clases abstractas son útiles cuando deseas:

  • Aplicar la implementación del método: Los métodos de una clase abstracta funcionan como un contrato, que exige que cada subclase proporcione su propia implementación. Esto reduce la posibilidad de implementaciones inconsistentes o incompletas, ya que garantiza que todas las clases derivadas cuenten con una funcionalidad específica.
  • Fomenta la reutilización del código: las clases abstractas pueden tener métodos tanto concretos como abstractos. Los métodos concretos reducen en gran medida la duplicación de código y fomentan los principios DRY (Do not Repeat Yourself, «no te repitas») al proporcionar una funcionalidad compartida que pueden heredar todas las subclases.
  • Mejorar la legibilidad y la facilidad de mantenimiento: Las clases abstractas ayudan a los programadores a comprender mejor la estructura y la funcionalidad del software, ya que proporcionan un marco coherente y transparente. Esta estructura facilita el mantenimiento del código al aplicar principios de diseño como la responsabilidad única y la separación de responsabilidades.
  • Fomenta el polimorfismo: Las clases abstractas permiten escribir código general que funciona bien con una variedad de subclases. Gracias a esta flexibilidad, los programadores pueden crear funciones o métodos que puedan manejar cualquier subclase de la clase abstracta, lo que aumenta la extensibilidad del código y su adaptabilidad a los cambios en el futuro.

Puedes asegurarte de que cualquier subclase, como Dog o Cat, implemente su implementación del método speak, por ejemplo, si tienes una clase abstracta Animal con un método abstracto speak. Tu código se vuelve confiable y predecible como resultado de esta uniformidad.

Aprende Python desde cero

Domina Python para la ciencia de datos y adquiere habilidades muy demandadas.
Empieza a aprender gratis

El módulo abc en Python

El módulo abc de Python ofrece un sólido soporte integrado para clases abstractas. El módulo, que significa «Clases base abstractas», proporciona a los programadores las herramientas necesarias para crear clases abstractas, incluyendo el decorador abstractmethod y la clase ABC. 

Al definir métodos abstractos y exigir su implementación en subclases, estas herramientas te ayudan a mantener la uniformidad y la conformidad con una interfaz predeterminada. Al exigir la implementación de métodos esenciales en todas las clases derivadas y permitir la implementación parcial de funcionalidades comunes en clases base abstractas, el módulo también fomenta la mejora de los patrones de diseño. 

Por este motivo, el módulo ABC es un componente crucial para organizar aplicaciones Python escalables, robustas y estables.

Creación de una clase abstracta en Python

En el módulo ABC se introducen dos componentes esenciales:

Clase base abstracta, o ABC

La clase ABC es una característica integrada en Python que sirve como base fundamental para desarrollar clases abstractas. Debes heredar de ABC para definir una clase abstracta. La clase es abstracta y no se puede instanciar directamente, tal y como indica esta herencia. Al actuar como planos, las clases abstractas garantizan que cualquier subclase concreta cumpla con un conjunto de reglas.

Puedes definir métodos abstractos dentro de una clase abstracta utilizando el decorador abstractmethod. Cualquier subclase concreta debe implementar y sobrescribir métodos abstractos, que son marcadores de posición. Esto hace que el código sea coherente y predecible, ya que garantiza que todas las clases derivadas ofrezcan funcionalidad para los métodos designados. Una herramienta útil para exigir la implementación de métodos y, al mismo tiempo, dar flexibilidad a las subclases en cuanto a cómo cumplir estos requisitos es el decorador abstractmethod.

Aquí tienes un ejemplo básico:

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14159 * self.radius ** 2

    def perimeter(self):
        return 2 * 3.14159 * self.radius

# Uncommenting the following line will raise an error because we’re missing method implementations
# shape = Shape() # TypeError: Can't instantiate abstract class Shape with abstract methods #area, perimeter

circle = Circle(5)
print(f"Area: {circle.area()}")
print(f"Perimeter: {circle.perimeter()}")

# Area: 78.53975
# Perimeter: 31.4159

Si estás buscando proyectos más prácticos en Python, echa un vistazo a nuestra lista de los 60 mejores proyectos en Python para programadores de todos los niveles. 

Cómo el módulo abc impone la implementación de métodos

Cualquier subclase de una clase abstracta garantiza la implementación de los métodos decorados gracias al decorador abstractmethod. Como medida de precaución, impide que se creen subclases que no tengan las capacidades necesarias. 

Python informa de un error TypeError (No se puede instanciar una subclase abstracta) cuando se intenta instanciar una subclase que no sobrescribe todos los métodos abstractos. Esta estricta aplicación reduce la probabilidad de que se produzcan defectos y mejora la estabilidad del código, ya que ayuda a los programadores a identificar tempranamente los fallos de implementación. 

También garantiza que todas las subclases concretas sigan el comportamiento y el diseño previstos por la clase abstracta.

Por ejemplo:

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    # Missing area and perimeter implementation

# This will raise an error
rectangle = Rectangle(5, 10)

# TypeError: Can't instantiate abstract class Rectangle with abstract methods area, perimeter

Métodos de clases abstractas en Python

En Python, definir una clase abstracta implica utilizar el decorador abstractmethod y crear una subclase a partir de ABC. Al hacer esto, los programadores pueden sentar las bases para otras clases definiendo los métodos que deben utilizarse. 

A continuación, se describe un procedimiento detallado paso a paso:

  • Incorpora los módulos necesarios: Lo primero es importar ABC y abstractmethod desde el móduloABC. Para definir clases y métodos abstractos, estas herramientas son necesarias.
  • Construye una clase basada en ABC: Crea una nueva clase y establece ABC como su heredero. La clase es abstracta y no se puede instanciar directamente, tal y como indica esta herencia.
  • Define métodos abstractos utilizando @abstractmethod: Para especificar qué métodos deben sobrescribir las subclases, utiliza el decorador @abstractmethod. En esencia, estos métodos sirven como marcadores de posición, garantizando que todas las clases derivadas lleven a cabo las operaciones necesarias.

Ejemplo paso a paso de cómo definir una clase abstracta

Aquí tienes un ejemplo práctico para ilustrarlo:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

class Car(Vehicle):
    def start_engine(self):
        print("Car engine started")

    def stop_engine(self):
        print("Car engine stopped")

# Instantiating the abstract class directly will raise an error
# vehicle = Vehicle()

car = Car()
car.start_engine()
car.stop_engine()

# Car engine started
# Car engine stopped

Esto garantiza que las funciones start_engine y stop_engine sean implementadas por cualquier subclase de Vehicle.

Ejemplo práctico: implementación de clases abstractas

Echa un vistazo a una ilustración más detallada utilizando una clase Vehicle:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    def __init__(self, brand):
        self.brand = brand

    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

class Motorcycle(Vehicle):
    def start_engine(self):
        print(f"{self.brand} motorcycle engine started")

    def stop_engine(self):
        print(f"{self.brand} motorcycle engine stopped")

motorcycle = Motorcycle("Yamaha")
motorcycle.start_engine()
motorcycle.stop_engine()
# Yamaha motorcycle engine started
# Yamaha motorcycle engine stopped

Esto ilustra cómo las clases abstractas permiten flexibilidad en la implementación al tiempo que imponen una interfaz coherente.

Ejemplo de clase base abstracta en Python

Ahora que hemos visto cómo las clases base abstractas definen un contrato para las subclases, exploremos cómo las clases concretas cumplen estos requisitos mediante la implementación de todos los métodos abstractos.

Clase concreta que hereda de una clase abstracta

Una subclase que implementa todos los métodos abstractos de una clase abstracta se denomina clase concreta. Esto indica que la clase concreta proporciona implementaciones específicas para todos los métodos necesarios, cumpliendo así el contrato establecido por la clase abstracta. 

Por ejemplo:

from abc import ABC, abstractmethod

class Appliance(ABC):
    @abstractmethod
    def turn_on(self):
        pass

    @abstractmethod
    def turn_off(self):
        pass

class WashingMachine(Appliance):
    def turn_on(self):
        print("Washing machine is now ON")

    def turn_off(self):
        print("Washing machine is now OFF")

machine = WashingMachine()
machine.turn_on()
machine.turn_off()

# Washing machine is now ON
# Washing machine is now OFF

Creación de instancias y aplicación de reglas

Python impide instanciar inmediatamente una clase abstracta. Dado que garantiza que cualquier subclase generada a partir de la clase abstracta se ajustará al contrato necesario proporcionado por sus métodos abstractos, este es un aspecto esencial de las clases abstractas. 

Por ejemplo, se generará una excepción TypeError si intentas instanciar appliance = Appliance()

Esta limitación garantiza que las clases abstractas funcionen solo como modelos y estén libres de abusos. Python permite la creación de instancias de WashingMachine manteniendo el contrato especificado en Appliance mediante la implementación de todos los métodos abstractos en WashingMachine. Al garantizar que todas las características especificadas en la clase abstracta se implementan completamente en sus subclases concretas, esta aplicación mejora la integridad del código base.

Propiedades abstractas e inicialización

Con esta base, profundicemos en cómo Python admite propiedades abstractas utilizando los decoradores @property y @abstractmethod, lo que permite a los programadores aplicar la coherencia de los atributos junto con los métodos.

Uso de propiedades abstractas en Python

Las clases abstractas pueden especificar propiedades que las subclases deben implementar además de los métodos. Esta característica permite a los programadores imponer una interfaz uniforme para las propiedades que las subclases deben declarar además de los métodos. 

Para garantizar que cada subclase proporcione su implementación, las propiedades abstractas se pueden especificar utilizando el decorador @property en combinación con @abstractmethod. Este método resulta especialmente útil a la hora de crear clases que necesitan atributos de solo lectura o calculados que son esenciales para el funcionamiento de la clase.

Ejemplo: clase abstracta con propiedades

Aquí tienes un ejemplo:

from abc import ABC, abstractmethod

class Animal(ABC):
    @property
    @abstractmethod
    def sound(self):
        pass

class Bird(Animal):
    @property
    def sound(self):
        return "Chirp"

bird = Bird()
print(bird.sound)

# Chirp

La condición de la clase abstracta Animal se cumple gracias a la característica sound de la clase Bird.

Cuándo utilizar clases abstractas en Python

Las clases abstractas son ideales para situaciones como:

  • Al diseñar marcos o bibliotecas en los que es necesario aplicar un comportamiento concreto: En sistemas complejos, las clases abstractas pueden establecer un conjunto unificado de directrices o interfaces que todas las subclases deben cumplir, lo que garantiza la coherencia y reduce los errores.
  • Implementación de API coherentes en todas las clases: Los programadores pueden garantizar que todas las clases derivadas ofrezcan un medio estandarizado y predecible de comunicarse con la aplicación o biblioteca mediante la definición de métodos abstractos.
  • Proporcionar un marco fundamental para una jerarquía de clases: Se puede crear una jerarquía de clases relacionadas utilizando clases abstractas como guía. Al permitir la personalización en subclases y permitir a los programadores declarar comportamientos y características compartidos en la clase abstracta, esta estructura fomenta la reutilización y minimiza la duplicación.

Mejores prácticas

Cuando sea necesario establecer un contrato preciso para las subclases, utiliza clases abstractas. Las clases abstractas son útiles cuando necesitas aplicar una estructura o un comportamiento específico a varias clases derivadas. Ayudan a garantizar que todas las subclases se ajusten a un diseño estándar, lo que mejora la previsibilidad del código y facilita el mantenimiento.

Si todos los métodos pueden tener una implementación predeterminada, no utilices clases abstractas. En determinadas situaciones, una clase base concreta puede ser una mejor opción para reducir la complejidad y, al mismo tiempo, conservar la capacidad de reutilizar la funcionalidad compartida.

Asegúrate de que las clases abstractas sean claras y sencillas, definiendo solo los atributos y métodos más importantes. Puede resultar complicado crear y mantener una clase abstracta si tiene demasiados criterios. En su lugar, concéntrate en los aspectos esenciales que deben tener las clases derivadas.

Conclusión

El kit de herramientas OOP de Python incluye clases abstractas, que son una herramienta poderosa que permite a los programadores crear programas fiables y fáciles de mantener. Puedes promover la claridad, la reutilización y la extensibilidad en tus aplicaciones definiendo clases abstractas y aplicando una interfaz uniforme en todas las subclases con la ayuda del módulo ABC. Se puede escribir código mejor y más fiable implementando clases abstractas, independientemente del tamaño del sistema en el que estés trabajando.

Tanto si estás diseñando programas orientados a objetos robustos, aplicando interfaces coherentes o creando aplicaciones escalables, dominar las clases abstractas de Python mejora tu capacidad para escribir código eficiente y fácil de mantener. Mejora hoy mismo tus conocimientos de Python con nuestro completo programa de habilidades Fundamentos de Python.

Preguntas frecuentes sobre clases abstractas en Python

¿Cómo se define un método abstracto en Python?

Un método abstracto se define utilizando el decorador « @abstractmethod » del módulo « abc ». Sirve como marcador de posición y debe ser sobrescrito por cualquier subclase.

¿Se puede instanciar una clase abstracta en Python?

No, no puedes instanciar una clase abstracta directamente. Python generará un error « TypeError » (No se permite la herencia) si intentas crear un objeto de una clase abstracta.

¿Cuál es el propósito del módulo «abc» en Python?

El módulo abc proporciona la clase ABC y el decorador abstractmethod para definir y aplicar clases y métodos abstractos en Python.

¿Puede una clase abstracta tener métodos regulares (concretos)?

Sí, una clase abstracta puede tener métodos concretos con implementación. Estos métodos pueden ser heredados y utilizados por subclases.


Derrick Mwiti's photo
Author
Derrick Mwiti
Temas

Los mejores cursos de Python

Programa

Fundamentos de Datos en Python

0 min
Desarrolla tus habilidades con los datos, descubre cómo manipularlos y visualizarlos, y aplica análisis avanzados para tomar decisiones basadas en datos.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Cómo aprender Python desde cero en 2024: Guía del experto

Descubre cómo aprender Python, sus aplicaciones y la demanda de conocimientos de Python. Comienza hoy tu andadura en Python ​con nuestra guía completa.
Matt Crabtree's photo

Matt Crabtree

15 min

Tutorial

Programación orientada a objetos (POO) en Python: Tutorial

Aborda los fundamentos de la Programación Orientada a Objetos (POO) en Python: explora las clases, los objetos, los métodos de instancia, los atributos y ¡mucho más!
Théo Vanderheyden's photo

Théo Vanderheyden

Tutorial

Tutorial Python Docstrings : Ejemplos y Formato de Cadenas Doc Pydoc, Numpy, Sphinx

Aprende sobre las Docstrings de Python. Encuentra diferentes ejemplos y tipos de formato de docstrings para Sphinx, Numpy y Pydoc.
Aditya Sharma's photo

Aditya Sharma

Tutorial

Aprendizaje automático de datos categóricos con el tutorial de Python

Aprenda los trucos más comunes para manejar datos categóricos y preprocesarlos para construir modelos de aprendizaje automático.
Moez Ali's photo

Moez Ali

SQLAlchemy_Tutorial.

Tutorial

Tutorial de SQLAlchemy con ejemplos

Aprende a acceder y ejecutar consultas SQL en todo tipo de bases de datos relacionales utilizando objetos Python.
Abid Ali Awan's photo

Abid Ali Awan

Tutorial

Clasificación de textos en Python

Descubra qué es la clasificación de textos, cómo funciona y casos de uso con éxito. Explore ejemplos de principio a fin sobre cómo crear un canal de preprocesamiento de texto seguido de un modelo de clasificación de texto en Python.
Moez Ali's photo

Moez Ali

Ver másVer más