programa
Clases abstractas de Python: Una guía completa con ejemplos
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
yabstractmethod
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 estableceABC
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.

Los mejores cursos de Python
curso
Intermediate Object-Oriented Programming in Python
programa
Python Developer

blog
Cómo aprender Python desde cero en 2024: Guía del experto
tutorial
Programación orientada a objetos (POO) en Python: Tutorial
tutorial
Tutorial de Docstrings en Python
tutorial
Aprendizaje automático de datos categóricos con el tutorial de Python
tutorial
Tutorial de SQLAlchemy con ejemplos
tutorial
Tutorial sobre cómo trabajar con módulos en Python
Nishant Kumar
8 min