Clases Abstractas - Ejemplos Prácticos con Python y ABC
Introducción
Hola amigos de Internet, les doy la bienvenida a Mi Diario Python, el mejor blog para Aprender Python.
En este articulo, veremos un tema muy importante en el ámbito de la programación, la programación orientada a objetos. Sí, se que en ocasiones puede ser un poco frustrante,
Antes de seguir leyendo, quiero advertir que este articulo es practico, por lo que no me desviare en dar los conceptos de los temas que se toquen en este articulo, por lo que asumo que el lector tenga un conocimiento breve sobre la programación orientada a objetos y la abstracción de datos.
Abstracción de Datos:
La Programación Orientada a Objetos, esta hay... siempre esta hay. Al llamar print, al declarar una variable y al hacer otras cosas.
Las librerías, las librerías que utilizamos son una serie de archivos con código, a los cuales tenemos acceso. Esto en ocasiones es un problema, ya que el cliente (el que utiliza la librería) podría alterar de alguna manera un objeto primordial.
Al crear una librería, estamos creando una relación con el usuario, el cual la utilizara para crear un programa u otra librería. En toda relación es importante tener fronteras que todas las partes respeten.
Para ello es importante utilizar la Abstracción de Datos, una caracteristica muy importante de la Programación Orientada a Objetos.
Pero... ¿Como podemos hacer todo esto? Python soporta la creación de clases abstractas, no al menos de forma nativa. Por ello desde la versión la 2.6 se agrego el modulo abc (Abstract base classes) a la librería estándar de Python.
Veremos como utilizar abc para la creación de clases abstractas.
Abstracción de Datos en Python utilizando abc.
La cosa de crear una clase abstracta, es que el cliente no pueda crear una instancia de esta.
""" Creare una clase "Animal", la cual utilizaremos para efectuar nuestros ejemplos La clase constara de dos metods. setName: el cual asignara un nombre al animal getName: el cual nos retornara el nombre del animal """ # Declaramos nuestra clase class Animal(object): # Primer método def setName(self, name): self.name = name # Segundo método def getName(self): return self.name
Ahora podemos crear una instancia de nuestra clase y utilizar sus métodos:
animal = Animal() # Instancia de nuestra clase animal.setName("Perro") # Asignación de nombre print(animal.getName())
Perro
Muy bien, ahora vemos como utilizar abc:
import abc from abc import ABC # Declaramos nuestra clase class Animal(ABC): def __init__(self): __metaclass__ = ABCMeta # Metaclase # Primer método # Decorador para métodos absctractos @abc.abstractmethod def setName(self, name): self.name = name # Segundo método # Decorador para métodos absctractos @abc.abstractmethod def getName(self): return self.name
Muy bien, como les mencione anteriormente, la librería abc nos permite crear clases abstractas.
import abc from abc import ABC # Declaramos nuestra clase class Animal(ABC): # Primer método # Decorador para métodos absctractos @abc.abstractmethod def setName(self, name): self.name = name # Segundo método # Decorador para métodos absctractos @abc.abstractmethod def getName(self): return self.name
Para crear las clases abstractas, antes debemos importar la librería abc y la clase ABC.
Como se puede ver en el ejemplo, a la clase con la que se trabajara (Animal), se hereda la clase ABC, esto es necesario para decirle a Python que la clase Animal es abstracta y no se podrán crear instancias de estas.
Luego, para definir que los métodos sean abstractas utilizamos el decorador de abc @abc.abstractmethod, esto para todos los métodos que sean necesarios.
Ahora, intentemos crear una instancia de la clase Animal modificada:
animal = Animal()
---------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-5d44ba9875b7> in <module>() ----> 1 animal = Animal() TypeError: Can't instantiate abstract class Animal with abstract methods getName, setName
Como podemos apreciar, al intentar crear una instancia, Python nos lanza un error, indicándonos que no se puede crear una instancia de Animal ya que esta es una clase abstracta.
¿Ahora? Ahora podemos crear una clase nueva, y heredar de Animal para sobrescribir sobre los métodos abstractos.
class Perro(Animal): def __init__(self): pass def setName(self, name): self.name = name def getName(self): return self.name perro = Perro() perro.setName("Marly") perro.getName()
'Marly'
Ahora, que tal si cambiamos la clase Animal para el manejo de propiedades:
import abc from abc import ABC # Declaramos nuestra clase class Animal(ABC): # Asignar nombre def set_name(self, name): pass # Obtener nombre def get_name(self): pass # Definimos las propiedades name = abc.abstractproperty(get_name, set_name)
class Perro(Animal): def __init__(self): pass # Propiedad para obtener el nombre @property def name(self): return self._name # Propiedad para asignar el nombre @name.setter def name(self, name): self._name = name perro = Perro() # Instancia de Perro perro.name = "Marly" # Asignación del nombre print(perro.name) # Obtenemos el valor de name
Marly
¿Que te parecio el tema? ¿Quieres más como este? Deje tu comentario y opinión.
Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
-
Muy buen tema.Voy empezando con python y me parece excelente el tópico.
Saludos -
Parece que hay varios errores importantes. Aconsejaría testar el codigo antes de publicarlo.
-
Por favor, ¡¡¡la ortografía!!!!
La Programación Orientada a Objetos, está ahí... siempre esta ahí.
-
watafak
-
-
Buen trabajo, gracias!
Deja una respuesta
Muy bueno