Actividades

 

Construir una calculadora de resolución de formas de área

Una de las mejores cosas de Python es que nos permite crear una gran variedad de software, desde un programa CLI (interfaz de línea de comandos) hasta una compleja aplicación web.

Ahora que has aprendido los conceptos fundamentales de la programación orientada a objetos, es el momento de aplicarlos en un proyecto real.

Nota: Todo el código siguiente estará disponible dentro de este repositorio de GitHub. Una herramienta de revisión de código que nos ayuda a gestionar las versiones del código con Git.

Tu tarea es crear una calculadora de áreas de las siguientes formas:

  • Cuadrado
  • Rectángulo
  • Triángulo
  • Círculo
  • Hexágono

Clase de base de la forma

En primer lugar, crea un archivo calculator.py y ábrelo. Como ya tenemos los objetos para trabajar, será fácil abstraction en una clase.

Puedes analizar las características comunes y descubrir que todas ellas son formas 2D. Por lo tanto, la mejor opción es crear una clase Shape con un método get_area() del que heredará cada forma.

Nota: Todos los métodos deben ser verbos. Eso es porque este método se llama get_area() y no area().

class Shape:
	def __init__(self):
		pass

	def get_area(self):
		pass

El código anterior define la clase; sin embargo, todavía no hay nada interesante en ella.

Vamos a implementar la funcionalidad estándar de la mayoría de estas formas.

class Shape:
	def __init__(self, side1, side2):
		self.side1 = side1
		self.side2 = side2

	def get_area(self):
		return self.side1 * self.side2

	def __str__(self):
		return f'The area of this {self.__class__.__name__} is: {self.get_area()}'

Vamos a desglosar lo que estamos haciendo con este código:

  • En el método __init__, estamos solicitando dos parámetros, side1 side2. Estos permanecerán como atributos de la instancia.
  • La función get_area() devuelve el área de la forma. En este caso, utiliza la fórmula del área de un rectángulo, ya que será más fácil de implementar con otras formas.
  • El método __str__() es un «método mágico» al igual que __init__(). Permite modificar la forma en que se imprimirá una instancia.
  • El atributo oculto self.__class__.__name__ se refiere al nombre de la clase. Si estuvieras trabajando con una clase Triangle, ese atributo sería «Triangule».

Clase Rectángulo

Ya que implementamos la fórmula del área del Rectángulo, podríamos crear una simple clase Rectangle que no hace más que heredar de la clase Shape.

Para aplicar la herencia en Python, crearás una clase como de costumbre y rodearás la superclase de la que quieres heredar con paréntesis.

# Folded base class
class Shape: ...
 
class Rectangle(Shape): # Superclass in Parenthesis
	pass

Clase cuadrada

Podemos hacer una excelente aproximación al polimorfismo con la clase Square.

Recuerda que un cuadrado es solo un rectángulo cuyos cuatro lados son iguales. Eso significa que podemos utilizar la misma fórmula para obtener el área.

Podemos hacerlo modificando el método init, aceptando solo un side como parámetro, y pasando ese valor del lado al constructor de la clase Rectangle.

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
 
class Square(Rectangle):
	def __init__(self, side):
		super().__init__(side, side)

Como puedes ver, la función super pasa el parámetro side dos veces a la superclase. En otras palabras, está pasando side tanto como side1 como side2 al constructor previamente definido.

Clase de triángulo

Un triángulo es la mitad de grande que el rectángulo que lo rodea.

Relación entre triángulos y rectángulos (Fuente de la imagen: Varsity tutors).
Relación entre triángulos y rectángulos (Fuente de la imagen: Varsity tutors).

Por lo tanto, podemos heredar de la clase Rectangle y modificar el método get_area para que coincida con la fórmula del área del triángulo, que es la mitad de la base multiplicada por la altura.

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
 
class Triangle(Rectangle):
	def __init__(self, base, height):
		super().__init__(base, height)
 
	def get_area(self):
		area = super().get_area()
		return area / 2

Otro caso de uso de la función super() es llamar a un método definido en la superclase y almacenar el resultado como una variable. Eso es lo que ocurre dentro del método get_area().

Clase circular

Puedes encontrar el área del círculo con la fórmula πr², donde es el radio del círculo. Eso significa que tenemos que modificar el método get_area() para implementar esa fórmula.

Nota: Podemos importar el valor aproximado de π desde el módulo matemático

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle):# At the start of the file
from math import pi
 
class Circle(Shape):
	def __init__(self, radius):
		self.radius = radius
 
	def get_area(self):
		return pi * (self.radius ** 2)

El código anterior define la clase Circle, que utiliza un constructor y métodos get_area() diferentes.

Aunque Circle hereda de la clase Shape, puedes redefinir cada método y atribuirlo a tu gusto.

Clase Hexágono Regular

Solo necesitamos la longitud de un lado de un hexágono regular para calcular su área. Es similar a la clase Square, donde solo pasamos un argumento al constructor.

Fórmula del área del hexágono (Fuente de la imagen: BYJU'S)
Fórmula del área del hexágono (Fuente de la imagen: BYJU’S)

Sin embargo, la fórmula es bastante diferente, e implica el uso de una raíz cuadrada. Por eso se utilizará la función sqrt() del módulo matemático.

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle):class Circle(Shape):# Import square root
from math import sqrt
 
class Hexagon(Rectangle):
	
	def get_area(self):
		return (3 * sqrt(3) * self.side1 ** 2) / 2

Probar nuestras clases

Puedes entrar en un modo interactivo cuando ejecutas un archivo de Python utilizando un depurador. La forma más sencilla de hacerlo es utilizando la función de punto de interrupción incorporada.

Nota: Esta función solo está disponible en Python 3.7 o superior.

from math import pi, sqrt
# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle):class Circle(Shape):class Hexagon(Rectangle): …
 
breakpoint()

Ahora, ejecuta el archivo Python y juega con las clases que has creado.

$ python calculator.py
 
(Pdb) rec = Rectangle(1, 2)(Pdb) print(rec)
The area of this Rectangle is: 2
(Pdb) sqr = Square(4)
(Pdb) print(sqr)
The area of this Square is: 16
(Pdb) tri = Triangle(2, 3)
(Pdb) print(tri)
The area of this Triangle is: 3.0
(Pdb) cir = Circle(4)
(Pdb) print(cir)
The area of this Circle is: 50.26548245743669
(Pdb) hex = Hexagon(3)
(Pdb) print(hex)
The area of this Hexagon is: 23.382685902179844

Comentarios