Google+ Seguidores

miércoles, 1 de agosto de 2018

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.

No hay comentarios :
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Powered by Blogger .