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, abstractmethodclass ADTPunto (object):__metaclass__ = ABCMeta@abstractmethoddef ValorX(self):pass@abstractmethoddef ValorY(self):pass@abstractmethoddef mover(self,puntoNuevo):pass@abstractmethoddef reset(self):pass@abstractmethoddef 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 = xself.__y = ysuper(Punto,self).__init__()@propertydef punto(self):"""el getter de punto, devuelve el punto"""return (self.__x,self.__y)@punto.setterdef punto(self,Punto):"""Asigna nuevo valor al punto"""self.__x = Punto.punto[0]self.__y = Punto.punto[1]@punto.deleterdef punto(self):"""Borra los valores del punto"""del self.__xdel self.__y@propertydef ValorX(self):"""Devuelve el valor de x"""return self.__x@propertydef ValorY(self):"""Devuelve el valor de y"""return self.__ydef reset(self):"""Fija el punto en (0,0)"""self.__x = 0self.__y = 0def 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.
El código completo de las clases se encuentran en gitlab en el repo tutorial-poo.
No hay comentarios:
Publicar un comentario