Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Por que usar @property em exibir_cardápio?

Quando eu executava app.py estava dando um erro TypeError: 'NoneType' object is not callable. Instalei o Copilot para analisar e ele me pediu para remover @property porque exibir_cardápio está realizando uma ação e é mais apropriado defini-lo como um método natural.

Fiz as alterações e o código funcionou normalmente. O códido no arquivo restaurante.py ficou assim:

código

from modelos.avaliacao import Avaliacao
from modelos.cardapio.item_cardapio import ItemCardapio

class Restaurante:
    restaurantes = []
    def __init__(self, nome, categoria):
        self._nome = nome.title()
        self._categoria = categoria.upper()
        self._ativo = False
        self._avaliacao = []
        self._cardapio = []
        Restaurante.restaurantes.append(self)

    def __str__(self):
        return f'{self._nome} | {self.categoria}'
    
    @classmethod
    def listar_restaurantes(cls):
        print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliação'.ljust(25)} | {'Status'}')
        for restaurante in cls.restaurantes:
            print(f'{restaurante._nome.ljust(25)} | {restaurante._categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.ativo}')

    @property
    def ativo(self):
        return '☑' if self._ativo else '☐'
    
    def alternar_estado(self):
        self._ativo = not self._ativo

    def receber_avaliacao(self, cliente, nota):
        if 0 < nota <= 5:
            avaliacao = Avaliacao(cliente, nota)
            self._avaliacao.append(avaliacao)

    @property
    def media_avaliacoes(self):
        if not self._avaliacao:
            return '-'
        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

    def adicionar_no_cardapio(self, item):
        if isinstance(item, ItemCardapio):
            self._cardapio.append(item)

    def exibir_cardapio(self):
        print(f'Cardapio do restaurante {self._nome}\n')
        for i,item in enumerate(self._cardapio,start=1):
            if hasattr(item,'descricao'):
                mensagem_prato = f'{i}. Nome: {item._nome} | Preço: R${item._preco} | Descrição: {item.descricao}'
                print(mensagem_prato)
            else:
                mensagem_bebida = f'{i}. Nome: {item._nome} | Preço: R${item._preco} | Tamanho: {item.tamanho}'
                print(mensagem_bebida)
1 resposta
solução!

Olá, Tobias! Tudo certo?

O uso do @property é ideal quando você deseja que um método seja acessado como um atributo de leitura, sem a necessidade de parênteses. No entanto, no seu caso, o método exibir_cardapio está realizando uma ação (imprimindo informações), o que faz mais sentido ser um método normal, como você já alterou.

O erro que você encontrou, TypeError: 'NoneType' object is not callable, geralmente ocorre quando tentamos chamar algo que não é uma função ou método. Ao remover o @property, você corrigiu isso, pois agora exibir_cardapio é claramente um método que precisa ser chamado com parênteses.

Seu código agora está correto, e o método exibir_cardapio está funcionando como esperado, exibindo o cardápio com os detalhes de cada item.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.