Python 101: Calculadora de áreas

Entendiendo las subclases de Python

Esta publicación hace referencia al ejercicio "Polygon Area Calculator" incluído en el curso Scientifice Computing with Python Projects al que puedes acceder a través del siguiente enlace:

https://www.freecodecamp.org/learn/scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator

Este ejercicio nos solicita crear una clase Rectangle y una subclase Square

class Rectangle: 
  def __init__(self, width, height):
    self.width = width
    self.height = height


class Square(Rectangle):
  def __init__(self, side):
    self.side = side
    super().__init__(side,side)

Definir las propiedades de Rectangle

def set_width(self, width):
  self.width = width

def set_height(self, height):
  self.height = height

Definir las propiedades de Square

Aquí hay que tener la precaución de actualizar también las propiedades de la clase padre.

def set_side(self,side):
  self.side = side
  super().set_width(side)
  super().set_height(side)

Una vez tenemos ya los parámetros introducidos y los setters disponibles, programaremos los distintos métodos que nos solicitan:

get_area

def get_area(self):
  return(self.height * self.width)

get_perimeter

def get_perimeter(self):
  return(2 * self.width + 2 * self.height)

get_diagonal

def get_diagonal(self):
  return((self.width**2 + self.height**2)** .5)

Lo siguiente que nos requiere el ejercicio es poder "pintar" el rectángulo/cuadrado por pantalla, suponiendo que cada unidad de medida es un asterisco.

De esta forma, un rectángulo de ancho 5 y alto 3 debería mostrarse como:

*****
*****
*****

El ejercicio indica, además, limitar la representación en pantalla a un lado máximo de 50.

get_picture

Este método he decidido abordarlo en dos partes. En la primera defino una variable line que va a incluir tantos asteriscos como valga la variable width. Una vez disponemos de ella, la introduciremos las veces definidas en heighten nuestro resultado intercalando saltos de línea cada vez.

def get_picture(self):
  if(self.width > 50 or self.height > 50):
    return "Too big for picture."
  else:
    line = ""
    result = ""
    line = line + "*"*self.width
    for k in range(self.height):
      result = result + line + "\n"
  return result

Por último, tenemos que calcular cuántas veces cabe un polígono dado dentro de otro. El ejercicio supone que una vez cubierta un área por el polígono, esta no puede ser parcialmente reutilizada otra vez.

def_get_amount_inside

Para resolver este problema hago uso de la división entera // que da como resultado el cociente entero de la división.

Esto es útil puesto que los decimales no son necesarios en este caso al tratarse de ocupación completa.

def get_amount_inside(self, polygon):
  width_times = self.width // polygon.width 
  height_times = self.height // polygon.height 
  return (width_times * height_times)

Con esto concluye el ejercicio.

En este caso, a diferencia del primero de los ejercicios, sí que he utilizado test unitarios, lo cual, ciertamente, aumenta enormemente la eficiencia del desarrollo.