Saltar al contenido principal

Clases abstractas de 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 imponer interfaces coherentes. Incluye ejemplos prácticos y buenas prácticas para una aplicación eficaz.
Actualizado 22 ene 2025  · 10 min de lectura

Un componente clave del desarrollo moderno de software es la programación orientada a objetos (POO), que proporciona 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 esenciales para crear una plantilla que puedan utilizar otras clases. Este post explicará las clases abstractas, sus ventajas y cómo utilizar el módulo abc de Python para construirlas con éxito.

¿Eres nuevo en Python? Aprende a trabajar con módulos y paquetes, a trabajar con tipos de datos incorporados y a escribir funciones personalizadas.

¿Qué es una clase abstracta?

Otras clases utilizan una clase abstracta como modelo. Aunque no proporciona su implementación, especifica los métodos que deben utilizar sus subclases. Esto permite a los programadores garantizar que todas las subclases sigan un contrato concreto, haciendo cumplir una interfaz uniforme en varias implementaciones.

Por ejemplo, una clase abstracta como Shape podría definir métodos como area y perimeter. La implementación de estas funciones se proporcionaría entonces para cada forma distinta, como un círculo o un rectángulo.

¿Quieres llevar tus conocimientos de programación orientada a objetos al siguiente nivel? Inscríbete en nuestro curso de Programación Orientada a Objetos Intermedia en Python

¿Por qué utilizar clases abstractas en Python?

Las clases abstractas son útiles cuando deseas

  • Haz cumplir la aplicación del método: Los métodos de una clase abstracta funcionan como un contrato, que requiere que cada subclase proporcione su propia implementación. Esto reduce la posibilidad de implementaciones incoherentes o deficientes, garantizando que la funcionalidad específica esté presente en todas las clases derivadas.
  • Fomentar la reutilización del código: las clases abstractas pueden tener métodos concretos y abstractos. Los métodos concretos reducen en gran medida la duplicación de código y fomentan los principios DRY (Do not Repeat Yourself) al proporcionar una funcionalidad compartida que pueden heredar todas las subclases.
  • Mejora la legibilidad y la mantenibilidad: Las clases abstractas ayudan a los desarrolladores a comprender mejor la estructura y la funcionalidad del software proporcionando un marco coherente y transparente. Esta estructura hace que el código sea más fácil de mantener 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 diversas subclases. Los desarrolladores pueden crear funciones o métodos que puedan manejar cualquier subclase de la clase abstracta gracias a esta flexibilidad, lo que aumenta la extensibilidad del código y su adaptabilidad a los cambios que se produzcan 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 fiable y predecible como resultado de esta uniformidad.

Conviértete en un desarrollador profesional de Python realizando nuestro curso de Desarrollador de Python hoy mismo. 

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, incluido el decorador abstractmethod y la clase ABC. 

Al definir métodos abstractos y exigir su implementación en las 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 ello, el módulo ABC es un componente crucial para organizar aplicaciones Python escalables, robustas y estables.

Crear una clase abstracta de Python

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

Clase base abstracta, o ABC

La clase ABC es una función incorporada en Python que sirve de base fundamental para desarrollar clases abstractas. Debes heredar de ABC para definir una clase abstracta. La clase es abstracta y no puede instanciarse directamente, como indica esta herencia. Al actuar como planos, las clases abstractas se aseguran de que cualquier subclase concreta se atenga a un conjunto de reglas.

Puedes definir métodos abstractos dentro de una clase abstracta utilizando el decorador abstractmethod. Cualquier subclase concreta debe implementar y anular los métodos abstractos, que son marcadores de posición. Esto hace que el código sea coherente y predecible, garantizando 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 a las subclases flexibilidad en la forma de cumplir estos requisitos es el decorador abstractmethod.

He aquí 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 buscas proyectos Python más prácticos, consulta nuestra lista de los 60 mejores proyectos Python para desarrolladores de todos los niveles. 

Cómo el módulo abc impone la implementación del método

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

Python informa de un TypeError cuando se intenta instanciar una subclase si no anula todos los métodos abstractos. Este estricto cumplimiento reduce la probabilidad de que se produzcan defectos y mejora la estabilidad del código, ayudando a los desarrolladores a identificar pronto los fallos de implementación. 

También garantiza que todas las subclases concretas sigan el comportamiento y el diseño previstos para 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 subclasificar a partir de ABC. De este modo, los programadores pueden sentar las bases para otras clases definiendo los métodos que deben utilizarse. 

Aquí tienes un procedimiento minucioso, paso a paso:

  • Introduce los módulos necesarios: Primero debes importar ABC y abstractmethod del móduloABC. Para definir clases y métodos abstractos, son necesarias estas herramientas.
  • Construye una clase basada en ABC: Crea una nueva clase y establece ABC como su heredera. La clase es abstracta y no puede instanciarse directamente, como indica esta herencia.
  • Define métodos abstractos utilizando @abstractmethod: Para especificar qué métodos deben anular las subclases, utiliza el decorador @abstractmethod. En esencia, estos métodos sirven como marcadores de posición, garantizando que todas las clases derivadas realicen las operaciones necesarias.

Ejemplo paso a paso de definición de una clase abstracta

He aquí un ejemplo práctico para demostrarlo:

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 Vehículo.

Ejemplo práctico: implementación de una clase abstracta

Echa un vistazo a una ilustración más completa utilizando una clase de 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 de implementación al tiempo que imponen una interfaz coherente.

Ejemplo de clase base abstracta de Python

Ahora que hemos visto cómo las clases base abstractas definen un contrato para las subclases, vamos a explorar cómo las clases concretas cumplen estos requisitos implementando 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

Crear instancias y aplicar reglas

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

Por ejemplo, se creará un TypeError si intentas instanciar appliance = Appliance()

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

Propiedades abstractas e inicialización

Con esta base, vamos a profundizar en cómo Python admite las propiedades abstractas mediante los decoradores @property’ and @abstractmethod', que permiten a los desarrolladores reforzar la coherencia de los atributos junto con los métodos.

Utilizar propiedades abstractas en Python

Las clases abstractas pueden especificar propiedades que las subclases deben implementar, además de métodos. Esta función permite a los desarrolladores imponer una interfaz uniforme para las propiedades que las subclases deben declarar, además de los métodos. 

Para garantizar que cada subclase proporciona su implementación, se pueden especificar propiedades abstractas utilizando el decorador @property en combinación con @abstractmethod. Cuando crees clases que necesiten atributos de sólo lectura o computados que sean esenciales para el funcionamiento de la clase, este método es especialmente útil.

Ejemplo: clase abstracta con propiedades

He aquí 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 la cumple la característica sound de la clase Bird.

Cuándo usar clases abstractas en Python

Las clases abstractas son ideales para situaciones como

  • Cuando se diseñan marcos o bibliotecas en los que es necesario imponer un comportamiento concreto: En sistemas complicados, las clases abstractas pueden establecer un conjunto unificado de directrices o interfaces que todas las subclases deben respetar, garantizando la coherencia y reduciendo los errores.
  • Implementación de API coherentes en todas las clases: Los desarrolladores 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 fundacional para una jerarquía de clases: Se puede crear una jerarquía de clases relacionadas utilizando las clases abstractas como guía. Al permitir la personalización en las subclases y que los desarrolladores declaren comportamientos y características compartidos en la clase abstracta, esta estructura fomenta la reutilización y minimiza la duplicación.

Buenas 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 comportamiento concreto a varias clases derivadas. Ayudan a garantizar que cada subclase se adhiere a un diseño estándar, lo que mejora la previsibilidad del código y facilita el mantenimiento.

Si cada método puede tener una implementación por defecto, no utilices clases abstractas. En determinadas situaciones, una clase base concreta puede ser una mejor opción para reducir la complejidad, preservando al mismo tiempo la capacidad de reutilizar la funcionalidad compartida.

Asegúrate de que las clases abstractas sean claras y sencillas, definiendo sólo los atributos y métodos más importantes. Puede resultar difícil construir 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 conjunto de herramientas de programación orientada a objetos de Python incluye clases abstractas, que son una potente herramienta que permite a los programadores crear programas fiables y mantenibles. Puedes fomentar la claridad, la reutilización y la extensibilidad en tus aplicaciones definiendo clases abstractas e imponiendo una interfaz uniforme en las subclases con la ayuda del módulo ABC. Se puede escribir un 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 robustos orientados a objetos, aplicando interfaces consistentes o creando aplicaciones escalables, dominar las clases abstractas de Python mejora tu capacidad para escribir código eficiente y mantenible. Aumenta tus conocimientos de Python hoy mismo con nuestro completo curso de Fundamentos de Python.

Preguntas frecuentes sobre clases abstractas en Python

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

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

¿Puedes instanciar una clase abstracta en Python?

No, no puedes instanciar directamente una clase abstracta. Python lanzará un TypeError si intentas crear un objeto de una clase abstracta.

¿Para qué sirve el 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 normales (concretos)?

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


Derrick Mwiti's photo
Author
Derrick Mwiti
Temas

Los mejores cursos de Python

programa

Python Data Fundamentals

28hrs hr
Grow your data skills, discover how to manipulate and visualize data, and apply advanced analytics to make data-driven decisions.
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

19 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

12 min

tutorial

Tutorial de Docstrings en Python

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

15 min

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

28 min

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

13 min

tutorial

Tutorial sobre cómo trabajar con módulos en Python

Los módulos te permiten dividir partes de tu programa en archivos diferentes para facilitar el mantenimiento y mejorar el rendimiento.

Nishant Kumar

8 min

Ver másVer más