1
resposta

Conclusão - Avaliação

avaliacao.py

class Avaliacao:
    def __init__(self, cliente, nota):
        self._cliente = cliente
        self._nota = nota

restaurante.py:

from modelos.avaliacao import Avaliacao

class Restaurante:
    restaurantes = []

    def __init__(self, nome, categoria): # Construtor com dois parâmetros
        self._nome = nome.title()  # Formata o nome do restaurante para primeira letra maiúscula
        self.categoria = categoria.upper()  # Formata a categoria para maiúsculas
        self._ativo = False   # Atributo privado para controle de ativo quando adiciona # "_"
        self._avaliacao = []
        Restaurante.restaurantes.append(self)


    def __str__(self):
        return f'Restaurante: {self._nome}, Categoria: {self.categoria}, Ativo: {self.ativo}'

    @classmethod
    def listar_restaurantes(cls):
        print(f'{"Nome":<25} | {"Categoria":<25} | {"Avaliação":<25} | {"Ativo"}')
        for restaurante in cls.restaurantes:
            print(f'{restaurante._nome:<25} | {restaurante.categoria:<25} | {restaurante.media_avaliacoes:<25} | {restaurante.ativo}')
        
        
    @property
    def ativo(self):
        return '✔️' if self._ativo else '❌'

    def alternar_estado(self):
        self._ativo = not self._ativo
        print(f'O restaurante {self._nome} agora está {"ativo" if self._ativo else "inativo"}.')

    def receber_avaliacao(self, cliente, nota):
        avaliacao = Avaliacao(cliente, nota)
        self._avaliacao.append(avaliacao)

    @property
    def media_avaliacoes(self):
        if not self._avaliacao:
            return 0
        soma_das_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
        media = round(soma_das_notas / len(self._avaliacao), 2)
        return media

app.py

from modelos.restaurante import Restaurante

restaurante_praca = Restaurante('praça', 'Gourmet')
restaurante_praca.receber_avaliacao('Gui', 10)
restaurante_praca.receber_avaliacao('Lais', 8)
restaurante_praca.receber_avaliacao('Emy', 2)

def main():
    Restaurante.listar_restaurantes()

if __name__ == '__main__':
    main()
1 resposta

Oi, Marcelo! Como vai?

Seu projeto ficou bem organizado, e a forma como você estruturou a classe Restaurante, utilizando atributos privados, métodos de classe e propriedades, mostra um domínio importante dos conceitos de Orientação a Objetos. Um ponto que chama atenção é a implementação do método media_avaliacoes, que encapsula bem a lógica de cálculo.

Uma dica interessante para o futuro é usar o método __len__ para personalizar como a função len() se comporta em instâncias da sua classe. Isso pode facilitar a leitura em alguns contextos. Veja este exemplo:


class Restaurante:
    def __len__(self):
        return len(self._avaliacao)

Com isso, ao usar len(restaurante_praca), você obterá a quantidade de avaliações do restaurante. Isso ajuda a tornar seu código mais intuitivo e reutilizável.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!