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'>]