Autor: Luis Fernando Apáez Álvarez
# Creamos una clase denominada Figura
class Figura():
# Constructor de la clase
def __init__(self, b, h):
self.base= b
self.altura = h
# Agrega al menos otros dos atributos al constructor:
# Atributo para las Figuras geométricas planas:
self.dimension = 2
# Atributo para el número máximo de lados
self.lados = 4
# -----------------------------------------------------------------------------
# Escribe el código pertinente para crear el método str y mostrar la base y
# altura de la figura
def __str__(self):
return f'Base: {self.base}\n Altura: {self.altura}'
class Color():
# Constructor de la clase
def __init__(self, color):
self.color = color
# Agrega al menos otro atributo adecuado al constructor
self.claro = False
self.oscuro = False
# Método str
def __str__(self):
return f'Color de la figura: {self.color}'
# Creación de las subclases del primer nivel (jerárquico)
class Triangulo(Figura, Color):
# Creamos el constructor
def __init__(self, L1, L2, b, h, color):
# Atributos propios de este constructor
self.lado1 = L1
self.lado2 = L2
# Atributos provenientes del constructor de la clase Figura
Figura.__init__(self, b, h)
# Atributos provenientes del constructor de la clase Color
Color.__init__(self, color)
# Crea el método str sobreescribiendo el método str de las clases padre
def __str__(self):
base_altura = Figura.__str__(self)
color = Color.__str__(self)
return f'{base_altura},{color}'
# ------------------------------------------------------------------------------
# Creamos un método para calcular el área de un triángulo:
# Usando la fórmula convencional...
def area(self):
return (self.base * self.altura) / 2
# ------------------------------------------------------------------------------
# Tu labor es implementar el método para calcular el área de un triángulo
# utilizando la FÓRMULA DE HERÓN, la cual explicamos abajo
def area_Heron(self):
# Semiperímetro
s = (self.lado1 + self.lado2 + self.base) / 2
# Producto
prod = s * (s - self.lado1) * (s - self.lado2) * (s - self.base)
return prod ** 0.5
# Creamos la clase Rectangulo
class Rectangulo(Figura, Color):
# Creamos el constructor de la clase.
# Usa de referencia el código del constructor de la clase Triangulo
# para escribir el constructor de esta clase
def __init__(self, b, h, color):
Figura.__init__(self, b, h)
Color.__init__(self, color)
# De manera análoga escribe el método str correspondiente
def __str__(self):
base_altura = Figura.__str__(self)
color = Color.__str__(self)
return f'{base_altura},{color}'
# Creamos un método para calcular el área
def area(self):
return self.base * self.altura
# Clase Cuadrado, subclase de la clase Rectangulo
class Cuadrado(Rectangulo):
# Creamos el constructor
def __init__(self, lado, color):
Rectangulo.__init__(self, lado, lado, color)
# Escribe el código pertinente para el método str
def __str__(self):
return Rectangulo.__str__(self)
Respuesta: No es necesario puesto que el método area() de la clase Rectangulo
def area(self):
return self.base * self.altura
involucra ya la fórmula para calcular el área de un cuadrado, lo cual (de acuerdo al código de la clase Cuadrado) podemos pensar como
# Sólo es explicativo, el siguiente código es sólo para darse una idea
# de cómo el método area() de la clase Rectangulo servirá para calcular
# el área en la clase Cuadrado:
def area(self):
return self.lado * self.lado
.area() como .area_Heron().# Instancia clase Triangulo
# Parámetros: L1, L2, b, h, color
triangulo1 = Triangulo(3, 5, 4, 3, 'Azul')
# Instancia clase Rectangulo
# Parámetros: b, h, color
rectangulo1 = Rectangulo(11, 7, 'Rojo')
# Instancia clase Cuadrado
# Parámetros: lado, color
cuadrado1 = Cuadrado(10, 'Amarillo')
# Áreas:
# Triangulo
# - fórmula usual
print(triangulo1.area())
# - fórmula de Herón
print(triangulo1.area_Heron())
6.0 6.0
Ten cuidado de definir los valores para los parámetros L1, L2, b, h, pues éstos deben ser congruentes con un triángulo dado, es decir, no podemos colocar por ejemplo valores tales como (1,1,1,1) u otros valores incongruentes.
# Rectangulo
print(rectangulo1.area())
print()
# cuadrado
print(cuadrado1.area())
77 100
str correspondientes.# Métodos str
# Triangulo
print(triangulo1)
Base: 4 Altura: 3,Color de la figura: Azul
# Rectangulo
print(rectangulo1)
Base: 11 Altura: 7,Color de la figura: Rojo
# Cuadrado
print(cuadrado1)
Base: 10 Altura: 10,Color de la figura: Amarillo
tringulo1, rectangulo1 y cudrado1 pertenecen a la clase# Para la clase Figura
print(isinstance(triangulo1, Figura))
print('-' * 20)
print(isinstance(rectangulo1, Figura))
print('-' * 20)
print(isinstance(cuadrado1, Figura))
True -------------------- True -------------------- True
# Para la clase Color
print(isinstance(triangulo1, Color))
print('-' * 20)
print(isinstance(rectangulo1, Color))
print('-' * 20)
print(isinstance(cuadrado1, Color))
True -------------------- True -------------------- True
# Para la clase Triangulo
print(isinstance(triangulo1, Triangulo))
print('-' * 20)
print(isinstance(rectangulo1, Rectangulo))
print('-' * 20)
print(isinstance(cuadrado1, Cuadrado))
True -------------------- True -------------------- True
cuadrado1 es un objeto de la clase Rectangulo. Deberás de utilizar isinstance() como se vió en la sesión 10.print(isinstance(cuadrado1, Rectangulo))
True
mro() para cada una de las clases y guarda dicha lista en la variable mro_Triangulo, mro_Rectangulo y mro_Cuadrado respectivamente.# Listas mro
mro_Triangulo = Triangulo.mro()
mro_Rectangulo = Rectangulo.mro()
mro_Cuadrado = Cuadrado.mro()
# Veamos dichas listas
print(mro_Triangulo)
[<class '__main__.Triangulo'>, <class '__main__.Figura'>, <class '__main__.Color'>, <class 'object'>]
print(mro_Rectangulo)
[<class '__main__.Rectangulo'>, <class '__main__.Figura'>, <class '__main__.Color'>, <class 'object'>]
print(mro_Cuadrado)
[<class '__main__.Cuadrado'>, <class '__main__.Rectangulo'>, <class '__main__.Figura'>, <class '__main__.Color'>, <class 'object'>]