Olá, pessoal!
Na minha resolução eu permiti qualquer nota , criar uma nova propriedade (@property) chamada media_ajustada. A grande vantagem dessa abordagem é que ela não modifica os dados originais (as notas reais), mas calcula um novo valor derivado sempre que é acessada. Usando uma list comprehension com a função min() para criar uma lista temporária de notas ajustadas.
Veja como ficou o código final na classe Restaurante:
class Restaurante:
# ... (código __init__, etc.)
@property
def media_avaliacoes(self):
"""Calcula a média REAL das avaliações do restaurante."""
if not self._avaliacao:
return 0
total = sum(avaliacao._nota for avaliacao in self._avaliacao)
return round(total / len(self._avaliacao), 1)
@property
def media_ajustada(self):
"""Calcula a média com notas ajustadas para um máximo de 5."""
if not self._avaliacao:
return 0
# AQUI ESTÁ A LÓGICA PRINCIPAL:
# Para cada avaliação, pega o menor valor entre a nota e 5.
# Ex: nota 8 vira 5, nota 3 continua 3.
notas_ajustadas = [min(avaliacao._nota, 5) for avaliacao in self._avaliacao]
total_ajustado = sum(notas_ajustadas)
return round(total_ajustado / len(self._avaliacao), 1)
Para exibir os resultados, atualizei o método listar_restaurantes para mostrar ambas as médias, deixando a diferença clara:
@classmethod
def listar_restaurantes(cls):
"""Lista todos os restaurantes cadastrados."""
header = (
f'{"Nome do restaurante".ljust(20)} | '
f'{"Categoria".ljust(20)} | '
f'{"Média Real".ljust(20)} | '
f'{"Média Ajustada".ljust(20)} | '
f'{"Status"}'
)
print(header)
for restaurante in cls.restaurantes:
nome = restaurante._nome.ljust(20)
categoria = restaurante._categoria.ljust(20)
media_real = str(restaurante.media_avaliacoes).ljust(20)
media_ajustada = str(restaurante.media_ajustada).ljust(20)
print(f'{nome} | {categoria} | {media_real} | {media_ajustada} | {restaurante.ativo}')
Saída:
Listagem inicial dos restaurantes:
Nome do restaurante | Categoria | Média Real | Média Ajustada | Status
Restaurante A | ITALIANA | 6.5 | 4.0 | ❌
Restaurante B | CHINESA | 5.5 | 4.5 | ❌
Restaurante C | JAPONESA | 6.0 | 4.0 | ❌
Listagem após alterar status:
Nome do restaurante | Categoria | Média Real | Média Ajustada | Status
Restaurante A | ITALIANA | 6.5 | 4.0 | ✅
Restaurante B | CHINESA | 5.5 | 4.5 | ❌
Restaurante C | JAPONESA | 6.0 | 4.0 | ✅