python-clases-abstractas

Cómo usar clases abstractas en Python

Una clase abstracta es una clase que no se puede instanciar directamente. Su propósito principal es ser heredada por otras clases que implementan los métodos definidos como abstractos en la clase base.

En Python, las clases abstractas se implementan utilizando el módulo abc (Abstract Base Classes). Este módulo proporciona herramientas para definir clases y métodos abstractos.

from abc import ABC, abstractmethod

Definiendo una Clase Abstracta

Para definir una clase abstracta, se debe heredar de ABC y utilizar el decorador @abstractmethod para marcar los métodos que deben ser implementados por las subclases.

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def hacer_sonido(self):
        pass

    def dormir(self):
        print("El animal está durmiendo.")

En este ejemplo,

  • Animal es una clase abstracta con un método abstracto hacer_sonido
  • Un método concreto dormir.

Implementando Clases Derivadas

Las clases que heredan de una clase abstracta deben implementar todos los métodos abstractos. Si una subclase no implementa un método abstracto, también se convierte en una clase abstracta y no se puede instanciar.

Veamos como implementar nuestra clase abstracta Animal

class Perro(Animal):
    def hacer_sonido(self):
        print("El perro ladra.")

class Gato(Animal):
    def hacer_sonido(self):
        print("El gato maúlla.")

En este ejemplo, Perro y Gato son subclases de Animal que implementan el método abstracto hacer_sonido.

Clases mixtas

Una clase abstracta puede tener tanto métodos abstractos como métodos concretos. Los métodos concretos proporcionan una implementación por defecto que puede ser heredada o sobrescrita por las subclases.

Vamos a verlo con un ejemplo,

class Vehiculo(ABC):
    @abstractmethod
    def conducir(self):
        pass

    def encender(self):
        print("El vehículo está encendido.")

class Coche(Vehiculo):
    def conducir(self):
        print("El coche está conduciendo.")

class Moto(Vehiculo):
    def conducir(self):
        print("La moto está conduciendo.")

En este ejemplo,

  • Vehiculo tiene un método abstracto conducir y un método concreto encender.
  • Las subclases Coche y Moto implementan conducir pero heredan encender.