1.5. Abstracción#
La abstracción es un termino que hace referencia a la ocultación de la complejidad intrínseca de una aplicación al exterior, centrándose sólo en como puede ser usada, lo que se conoce como interfaz (o clases abstractas).
En términos simples, la abstracción permite a los programadores enfocarse en la funcionalidad importante de un objeto sin preocuparse por cómo se implementa internamente esa funcionalidad.

Para poder crear clases abstractas en Python es necesario importar la clase ABC
y el decorador abstractmethod
del modulo abc
(Abstract Base Classes).
Un módulo que se encuentra en la librería estándar del lenguaje, por lo que no es necesario instalar. Así para definir una clase privada solamente se tiene que crear una clase heredada de ABC
con un método abstracto.
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def mover(self):
pass
Ahora si se intenta crear una instancia de la clase animal, Python no lo permitirá indicando que no es posible. Es importante notar que que si la clase no hereda de ABC
o contiene por lo menos un método abstracto, Python permitirá instancias las clases.
class Animal(ABC):
def mover(self):
pass
Animal()
<__main__.Animal at 0x1fece214f10>
class Animal():
@abstractmethod
def mover(self):
pass
Animal()
<__main__.Animal at 0x1fecea64430>
1.5.1. Métodos en las subclases#
Las subclases tienen que implementar todos los métodos abstractos, en el caso de que falta alguno de ellos Python no permitirá instancias tampoco la clase hija.
# clase abstracta
class Animal(ABC):
@abstractmethod
def mover(self):
pass
@abstractmethod
def comer(self):
print('Animal come')
# subclase
class Gato(Animal):
def mover(self):
print('Mover gato')
# falta implementar metodo comer()
g = Gato() # Error
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[14], line 1
----> 1 g = Gato() # Error
TypeError: Can't instantiate abstract class Gato with abstract methods comer
Escribamos el ejemplo correctamente:
# clase abstracta
class Animal(ABC):
@abstractmethod
def mover(self):
pass
@abstractmethod
def comer(self):
print('Animal come')
# subclase
class Gato(Animal):
def mover(self):
print('Mover gato')
def comer(self):
print('Gato come')
# Crear un objeto de la clase Gato
g = Gato()
# metodo mover
g.mover()
# metodo comer
g.comer()
Gato come