Clases abstractas en Python
Este artículo explica las clases abstractas en Python.
Explicaremos el mecanismo básico de las clases abstractas utilizando el módulo abc
, proporcionaremos ejemplos prácticos y describiremos todo con código adjunto.
YouTube Video
Clases abstractas en Python
El módulo abc
de Python (Clases Base Abstractas) forma parte de la biblioteca estándar y se utiliza para definir clases abstractas, proporcionando una plantilla para los métodos que una clase debe implementar. El uso de este módulo mejora la flexibilidad y la robustez en el diseño de clases.
¿Qué es una clase abstracta?
Las clases abstractas son clases utilizadas para definir una interfaz común para las clases concretas (que se pueden instanciar). Las clases abstractas no se pueden instanciar por sí mismas; se debe proporcionar una implementación concreta en las clases derivadas (subclases).
El módulo abc
te permite definir métodos o propiedades abstractos y exigir su implementación en las clases que los heredan. Si al menos un método abstracto no se implementa, la clase no se puede instanciar.
Cómo usar el módulo abc
Para crear una clase abstracta utilizando el módulo abc
, hereda de la clase ABC
y define métodos abstractos utilizando el decorador @abstractmethod
.
1from abc import ABC, abstractmethod
2
3# Definition of the abstract base class
4class Animal(ABC):
5
6 @abstractmethod
7 def sound(self):
8 pass
9
10# Concrete implementation in the subclass
11class Dog(Animal):
12 def sound(self):
13 return "Woof!"
14
15class Cat(Animal):
16 def sound(self):
17 return "Meow!"
Aquí, la clase Animal
se define como una clase abstracta e incluye un método abstracto llamado sound
. Este método debe ser implementado concretamente en las subclases. Dog
y Cat
heredan de Animal
y cada una implementa el método sound
.
Instanciar clases abstractas
Las clases abstractas no se pueden instanciar directamente. Por ejemplo, intentar instanciar la clase Animal
directamente resultará en un error.
1animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods sound
- Al intentar instanciar una clase abstracta, Python detecta que hay métodos abstractos no implementados y lanza un
TypeError
. Si todos los métodos abstractos requeridos se implementan en la subclase, la instanciación se vuelve posible.
Múltiples métodos abstractos
También es posible que una clase tenga múltiples métodos abstractos. A menos que todos los métodos abstractos se implementen en una subclase, la clase seguirá siendo una clase abstracta.
1from abc import ABC, abstractmethod
2
3class Vehicle(ABC):
4
5 @abstractmethod
6 def start_engine(self):
7 pass
8
9 @abstractmethod
10 def stop_engine(self):
11 pass
12
13class Car(Vehicle):
14 def start_engine(self):
15 return "Car engine started"
16
17 def stop_engine(self):
18 return "Car engine stopped"
En este ejemplo, la clase Vehicle
tiene dos métodos abstractos, y la clase Car
solo puede ser instanciada después de implementar ambos métodos.
Definiendo Propiedades Abstractas
El módulo abc
soporta no solo métodos abstractos, sino también propiedades abstractas. Esto permite garantizar la implementación de propiedades en clases derivadas.
1from abc import ABC, abstractmethod
2
3class Shape(ABC):
4
5 @property
6 @abstractmethod
7 def area(self):
8 pass
9
10class Circle(Shape):
11 def __init__(self, radius):
12 self.radius = radius
13
14 @property
15 def area(self):
16 return 3.14159 * (self.radius ** 2)
- En este ejemplo, la clase
Shape
tiene una propiedad abstractaarea
, y la subclaseCircle
concreta esta propiedad. De esta manera, usar clases abstractas para garantizar la implementación de propiedades ayuda a mantener la consistencia del código.
Usando isinstance()
e issubclass()
Al usar clases abstractas, puedes confirmar las relaciones de herencia de clases con isinstance()
o issubclass()
, mejorando la seguridad y flexibilidad del código.
1from abc import ABC, abstractmethod
2
3# Definition of the abstract base class
4class Animal(ABC):
5
6 @abstractmethod
7 def sound(self):
8 pass
9
10# Concrete implementation in the subclass
11class Dog(Animal):
12 def sound(self):
13 return "Woof!"
14
15class Cat(Animal):
16 def sound(self):
17 return "Meow!"
18
19class Vehicle(ABC):
20
21 @abstractmethod
22 def start_engine(self):
23 pass
24
25 @abstractmethod
26 def stop_engine(self):
27 pass
28
29class Car(Vehicle):
30 def start_engine(self):
31 return "Car engine started"
32
33 def stop_engine(self):
34 return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal)) # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal)) # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle)) # False
isinstance()
se usa para verificar si un objeto es una instancia de una clase específica, e issubclass()
se usa para verificar si una clase es una subclase de una clase específica.
Resumen
Al diseñar clases abstractas usando el módulo abc
, puedes clarificar la interfaz entre clases y garantizar la implementación de métodos y propiedades requeridos. Esto ayuda a mantener la consistencia del código y reduce errores, haciéndolo particularmente útil para proyectos a gran escala.
Las clases abstractas son una herramienta importante en Python que respaldan la programación orientada a objetos flexible, mejorando la reutilización y mantenibilidad de las clases.
Puedes seguir el artículo anterior utilizando Visual Studio Code en nuestro canal de YouTube. Por favor, también revisa nuestro canal de YouTube.