Abstracción

Open In Colab

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.

Descripción de la imagen

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