Volviendo a lo básico, POO en Python (parte 6)
Continuando con la serie de artículos sobre Programación Orientada a Objetos en Python.
En este artículo se explica el uso del decorador classmethod el cual se le pasa como argumentos la clase.
Se tiene una clase abstracta que se llama figura, en ella se tiene los siguientes decoradores:
- abstractmethod: Métodos abstractos que no contienen nada, sólo la descripción de los métodos, estos métodos son: area, perimetro y quienEresTu.
- abstractproperty: Propiedad abstracta, en este caso se define el método color.
- property: El método color devuelve el color como propiedad.
- @color.setter: Define un nuevo color.
- classmethod: Se define __subclasshook__ como un classmethod, quien permite personalizar el comportamiento de Issubclass sin necesidad de registrar subclase de la clase abstracta (este método debe devolver True, False o NotImplemented).
A continuación se muestra el código de la clase Figura:
#Se importa sqrt de math
from math import sqrt#Se importa ABCMeta, abstractmethod, abstractpropertyfrom abc import ABCMeta, abstractmethod,abstractproperty#Interfaceclass Figura(object):__metaclass__ = ABCMeta@abstractmethoddef area(self):"""Calcula el area"""pass@abstractmethoddef perimetro(self):"""Calcula el perimetro"""pass@abstractmethoddef quienEresTu(self):"""Devuelve el mensaje de quien es el objeto"""print (u"Soy una forma y un método abstracto ")@abstractpropertydef color(self):pass@propertydef color(self):pass@color.setterdef color(self,valor):pass@classmethoddef __subclasshook__(cls, C):return NotImplemented
Se muestra el código de la clase Rectangulo:
class Rectangulo(Figura): def __init__(self,ancho, alto): """Define los atributos de rectangulo""" self.ancho, self.alto = ancho, alto super(Rectangulo,self).__init__() self.__color = "rojo" def area(self): """Devuelve el area""" return self.ancho*self.alto def perimetro(self): """devuelve el perimetro""" return 2*self.ancho+2*self.alto @property def color(self): """Devuelve el atributo color""" return self.__color @color.setter def color(self,valor): """Define el color del rectangulo""" self.__color = valor def quienEresTu(self): """devuelve que es el objeto""" print (u"Soy un Rectangulo")
A continuación se muestra el código de la clase Cuadrado:
class Cuadrado(Rectangulo):
def __init__(self,largo):
"""Define el largo del cuadrado y se lo pasa a la clase rectangulo"""
self.largo = largo
super(Cuadrado,self).__init__(largo,largo)
def area(self):
"""DEvuelve el area del cuadrado"""
return self.largo*self.largo
class Cuadrado(Rectangulo):
def __init__(self,largo):
"""Define el largo del cuadrado y se lo pasa a la clase rectangulo"""
self.largo = largo
super(Cuadrado,self).__init__(largo,largo)
def area(self):
"""DEvuelve el area del cuadrado"""
return self.largo*self.largo
Para terminar se muestra la implementación de las clases:
if __name__ == '__main__':r = Rectangulo(5,6)print ("Es una subclase rectangulo de shape?:",issubclass(Rectangulo,Figura))print ("Es una subclase cuadrado de shape?:",issubclass(Cuadrado,Figura))print ("Es una subclase cuadrado de rectangulo?:",issubclass(Cuadrado,Rectangulo))print ("Es una subclase rectangulo de cuadrado?:",issubclass(Rectangulo,Cuadrado))print ("r es una instancia de rectangulo?:",isinstance(r,Rectangulo))print ("r es una instancia de cuadrado?:",isinstance(r,Cuadrado))print ("Area del rectangulo:",r.area())print("Color del rectangulo:",r.color)r.color = "Black"print("Color del rectangulo:",r.color)print ("Perimetro del rectangulo",r.perimetro())r.quienEresTu()sq = Cuadrado(5)print ("Area del cuadrado:",sq.area())print ("Perimetro del cuadrado:",sq.perimetro())
Al ejecutar el código se tiene el siguiente resultado:
Es una subclase rectangulo de shape?: True
Es una subclase cuadrado de shape?: True
Es una subclase cuadrado de rectangulo?: True
Es una subclase rectangulo de cuadrado?: False
r es una instancia de rectangulo?: True
r es una instancia de cuadrado?: False
Area del rectangulo: 30
Color del rectangulo: rojo
Color del rectangulo: Black
Perimetro del rectangulo 22
Soy un Rectangulo
Area del cuadrado: 25
Perimetro del cuadrado: 20
El código completo de las clases lo pueden encontrar en gitlab en el siguiente enlace.
No hay comentarios:
Publicar un comentario