Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Não estava funcionando o hasattr então fiz desse jeito, como poderia arrumar para usar o hasattr?

from modelos.avaliacao import Avaliacao
from modelos.cardapio.item_cardapio import ItemCardapio
from modelos.cardapio.prato import Prato
from modelos.cardapio.bebida import Bebida

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'}\n")
        for restaurante in cls.restaurantes:
            print(f"{restaurante._nome.ljust(25)} | {restaurante._categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.ativo}")
        print()

    @property
    def ativo(self):
        return '☑' if self._ativo else '☒'

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

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

    @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)
        media = min(media, 5)
        return '5.0' if media == 5 else media
    
    def adicionar_no_cardapio(self, item):
        if isinstance(item, ItemCardapio):
            self._cardapio.append(item)

    @property
    def exibir_cardapio(self):
        print(f'Cardapio do restaurante {self._nome}\n')
        for i, item in enumerate(self._cardapio, start=1):
            if isinstance(item, Prato):  # Verifica se é um prato
                mensagem_prato = f'{i}. Nome: {item._nome} | Preço: R${item._preco} | Descrição: {item._descricao}'
                print(mensagem_prato)
            elif isinstance(item, Bebida):  # Verifica se é uma bebida
                mensagem_bebida = f'{i}. Nome: {item._nome} | Preço: R${item._preco} | Tamanho: {item._tamanho}'
                print(mensagem_bebida)
            else:
                print(f'{i}. Nome: {item._nome} | Preço: R${item._preco}')  # Caso genérico para outros tipos
        print()

estava aparecendo isso com o hasattr: Cardapio do restaurante Praça

Traceback (most recent call last): File "D:\Alura\oo-Sabor-Express\app.py", line 15, in main() File "D:\Alura\oo-Sabor-Express\app.py", line 12, in main restaurante_praca.exibir_cardapio File "D:\Alura\oo-Sabor-Express\modelos\restaurante.py", line 62, in exibir_cardapio mensagem_bebida = f'{i}. Nome: {item._nome} | Preço: R${item._preco} | Tamanho: {item.tamanho}' ^^^^^^^^^^^^ AttributeError: 'Bebida' object has no attribute 'tamanho'. Did you mean: '_tamanho'?

2 respostas

Esse erro ondica que você estava tentando acessar o atributo "tamanho" mas o atrobuto correto é "_tamanho"

solução!

eu consegui, era porque no if hasattr(item, 'descrição'): estava escrevendo descrição em vez de _descricao mas obrigado porque me deu a ideia de mudar porcausa da sua ajuda