1
resposta

Mão na massa - Resolução

Alterações no arquivo restaurante.py

recusar notas que não estejam entre 0 e 5:

def receber_avaliacao(self, cliente, nota):
        avaliacao = Avaliacao(cliente, nota)
        if avaliacao._nota < 0 or avaliacao._nota > 5:
            print('Erro: A nota deve ser entre 0 e 5.')
            return
        self._avaliacao.append(avaliacao)

Alterando a mensagem para quando não houver avaliações:

@property
    def media_avaliacoes(self):
        if not self._avaliacao:
            return "Sem avaliações"
        soma_das_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
        quantidade_de_notas = len(self._avaliacao)
        media = round(soma_das_notas / quantidade_de_notas, 1)
        return media
1 resposta

Olá, Luiz Fernando! Como vai?

Parabéns por concluir mais essa etapa do projeto! Suas implementações no arquivo restaurante.py mostram que você está dominando o uso de encapsulamento e propriedades no Python, especialmente na hora de proteger a integridade dos dados.

Gostaria de destacar dois pontos excelentes na sua solução:

  • Validação de Entrada: O if que você adicionou no método receber_avaliacao é fundamental. Ao recusar notas fora do intervalo de 0 a 5, você evita que a média do restaurante seja distorcida por valores inválidos, garantindo a consistência do sistema.
  • Tratamento de Lista Vazia: Na sua @property media_avaliacoes, o uso do if not self._avaliacao é uma prática recomendada. Além de evitar o erro clássico de divisão por zero (que aconteceria se você tentasse calcular a média de uma lista vazia), você ainda melhora a experiência do usuário ao retornar uma mensagem amigável como "Sem avaliações".

Uma dica para deixar seu código ainda mais "Pythonico"

No método receber_avaliacao, você está criando o objeto Avaliacao antes de validar a nota. Em sistemas maiores, uma boa prática é validar o dado antes de instanciar o objeto. Assim, você economiza memória e processamento:

def receber_avaliacao(self, cliente, nota):
    # Valida primeiro, instancia depois
    if nota < 0 or nota > 5:
        print('Erro: A nota deve ser entre 0 e 5.')
        return
        
    avaliacao = Avaliacao(cliente, nota)
    self._avaliacao.append(avaliacao)

Além disso, note que você usou avaliacao._nota. Como esse atributo começa com um underline, ele é considerado "protegido" por convenção no Python. O ideal é que a própria classe Avaliacao tenha uma propriedade para expor essa nota de forma segura.

Você está no caminho certo para construir aplicações robustas e bem estruturadas. Continue mantendo esse olhar atento às validações de regras de negócio!

Espero que possa ter lhe ajudado!