1
resposta

[Dúvida] Pelo que eu entendi do erro o if nao esta sendo chamado so que e mchamado como parametro e o else

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_avaliacao).ljust(25)} | {restaurante._ativo}')

    
    @property
    def alternar_estado(self):
        self._ativo = not self._ativo


    def recebe_avaliacao(self,cliente,nota):
        if 0 <nota <=5:
            avaliacao=Avaliacao(cliente,nota)
            self._avaliacao.append(avaliacao)
       
  
    @property
    def media_avaliacao(self):
        if not self._avaliacao:
            return 'Restaurante sem nota'
        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 adiciona_item_no_cardapio(self,item):
        if isinstance (item,ItemCardapio):
            self._cardapio.append(item)
    
    @property
    def exibi_cardapio(self):
        print(f'Cardapio do restaurante {self._nome}\n')
        for i , item in enumerate (self._cardapio,start=1):
            if  hasattr(item,'tamanho'):
                mensagem_prato= f'{i}.Nome:{item._nome} | Preço: R${item._preco} | descricao {item._descricao}'
                print(mensagem_prato)
            else:
                 mensagem_bebida= f'{i}.Nome:{item._nome} | Preço: R${item._preco} | tamanho {item._tamanho}'
                 print(mensagem_bebida)
        
    
    
``class Prato(ItemCardapio):
    def __init__(self,nome,preco,descricao):
        super().__init__(nome,preco)
        self._descricao=descricao
        self._tamanho= None
        
    def __str__(self) :
        return self._nome`
class ItemCardapio:
    def __init__(self,nome,preco):
        self._nome=nome
        self._preco=preco
class Bebida(ItemCardapio):
    def __init__(self,nome,preco,tamanho):
        super().__init__(nome,preco)
        self._tamanho=tamanho
        self._descricao = None
    def __str__(self) :
        return self._nome
from modelos.restaurante import Restaurante
from modelos.cardapio.bebida import Bebida
from modelos.cardapio.prato import Prato
restaurante_praca = Restaurante('praça','Gourmet') 
bebida_suco = Bebida('Suco de Melancia',5,'Grande')
prato_paozinho = Prato('Paozinho',2,'O melhor pão da cidade')
restaurante_praca.adiciona_item_no_cardapio(bebida_suco)
restaurante_praca.adiciona_item_no_cardapio(prato_paozinho)
def main():
    restaurante_praca.exibi_cardapio

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

Olá, Cauã! Como vai?

Do jeito que você explicou, o if esta invertido. Veja este ponto importante:

  • Prato possui o atributo _descricao
  • Bebida possui o atributo _tamanho

No seu código, você verifica tamanho, mas monta a mensagem como se fosse prato. Isso faz o if nunca funcionar como esperado.

Ajuste seu código assim:


def exibi_cardapio(self):
    print(f'Cardapio do restaurante {self._nome}\n')
    for i, item in enumerate(self._cardapio, start=1):
        if hasattr(item, '_descricao') and item._descricao is not None:
            mensagem_prato = f'{i}. Nome: {item._nome} | Preco: R${item._preco} | descricao: {item._descricao}'
            print(mensagem_prato)
        else:
            mensagem_bebida = f'{i}. Nome: {item._nome} | Preco: R${item._preco} | tamanho: {item._tamanho}'
            print(mensagem_bebida)

Esse código verifica corretamente se o item tem descricao, identificando um Prato. Caso contrario, ele trata como Bebida. Outro ponto importante: no método main, você esqueceu de chamar o método com parenteses.

Resolva fazendo o seguinte:


def main():
    restaurante_praca.exibi_cardapio()

Sem os parenteses, o método não é executado.

Espero ter ajudado e bons estudos!

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