19 dic. 2016

Volviendo a lo básico, POO en Python (parte 5)

Volviendo a lo básico, POO en Python (parte 5)


Continuando con los artículos sobre Programación Orientada a Objetos en Python, en este caso se usará lo que se vió en la parte 4 de la serie, donde se creó una clase Punto2D y se creó una clase hija Punto3D que heredaba de la Punto2D.

En este caso se incorporarán nuevos conceptos:
  • meta clases (clase abstracta)
  • método abstracto: 
Con la clase abstracta se define una clase con sus métodos abstractos que no hacen nada, sólo declaran las clases, luego se hereda dicha clase y se van implementando los métodos que se definieron abstractactos. 

En este caso se crea la clase abstracta ADTPunto que define una serie de métodos, luego se crea la clase punto que hereda de ADTPunto, aquí se implementan los métodos que se definieron en la clase abstracta, la clase abstacta termina siendo como una interfaz de una clase. 

A continuación se muestra el código de la clase abstracta punto: 

from abc import ABCMeta, abstractmethod
class ADTPunto (object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def ValorX(self):
        pass
    @abstractmethod
    def ValorY(self):
        pass
    @abstractmethod
    def mover(self,puntoNuevo):
        pass
    @abstractmethod
    def reset(self):
        pass
    @abstractmethod
    def distanciaOtroPunto(self,punto):
        pass

A continuación se muestra la clase Punto que hereda de ADTPunto:
from math import sqrt
class Punto(ADTPunto):
    def __init__(self,x,y):
        self.__x = x
        self.__y = y
        super(Punto,self).__init__()
    @property
    def punto(self):
        """el getter de punto, devuelve el punto"""
        return (self.__x,self.__y)
    @punto.setter
    def punto(self,Punto):
        """Asigna nuevo valor al punto"""
        self.__x = Punto.punto[0]
        self.__y = Punto.punto[1]
    @punto.deleter
    def punto(self):
        """Borra los valores del punto"""
        del self.__x
        del self.__y
    @property
    def ValorX(self):
        """Devuelve el valor de x"""
        return self.__x
    @property
    def ValorY(self):
        """Devuelve el valor de y"""
        return self.__y
    def reset(self):
        """Fija el punto en (0,0)"""
        self.__x = 0
        self.__y = 0
    def distanciaOtroPunto(self,oPunto):
        '''devuelve la distancia entre el punto original y un punto dado'''
        return sqrt((self.__x - oPunto.punto[0])**2 + (self.__y - oPunto.punto[1])**2 )
    def mover(self,oPunto):
        """Cambia el punto a un nuevo punto"""
        self.__x = oPunto.punto[0]
        self.__y = oPunto.punto[1]

Para finalizar se muestra la instanciación de ambas clases:

if __name__ == "__main__":
    try:
        prueba = ADTPunto()
    except (TypeError):
        print ("No puede instanciar una clase abstracta")
    punto2d = Punto(3,5)
    print(punto2d.punto)
    print(punto2d.ValorX)
    print(punto2d.ValorY)
    punto2d.mover(Punto(5,5))
    print(punto2d.punto)
    print(punto2d.distanciaOtroPunto(Punto(10,10)))
    punto2d.reset()
    print(punto2d.punto)

Al ejecutar el script se tiene lo siguiente:

python ej12_adt.py 
No puede instanciar una clase abstracta
(3, 5)
3
5
(5, 5)
7.07106781187
(0, 0)


Como se puede ver, se intento instanciar la clase ADTPunto, lo cual genera un error de tipo.

El código completo de las clases se encuentran en gitlab en el repo tutorial-poo.



Publicar un comentario en la entrada

AddThis