Volviendo a lo básico, POO en Python (parte 6)
Posted on sáb 31 diciembre 2016 in Tutorial Python • 3 min read
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).
Luego se crea la clase Rectangulo que hereda de la clase abstracta Figura, luego se crea la clase Cuadrado que hereda de la clase Rectangulo.
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, abstractproperty
from abc import ABCMeta, abstractmethod,abstractproperty
#Interface
class Figura(object):
__metaclass__ = ABCMeta
@abstractmethod
def area(self):
"""Calcula el area"""
pass
@abstractmethod
def perimetro(self):
"""Calcula el perimetro"""
pass
@abstractmethod
def quienEresTu(self):
"""Devuelve el mensaje de quien es el objeto"""
print (u"Soy una forma y un método abstracto ")
@abstractproperty
def color(self):
pass
@property
def color(self):
pass
@color.setter
def color(self,valor):
pass
@classmethod
def __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
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.
¡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: