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

Posted on lun 19 diciembre 2016 in Tutorial Python • 2 min read

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 abstractos.

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 abstracta 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 intentó 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.

¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV

O Escaneando el código QR desde la billetera:

17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV