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

[Dúvida] o hasattr não está funcionando

Olá! Tenho uma dúvida em relação ao "hasattr".

from Cardápio import Comida, Bebida, Item_Cardapio

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

class Restaurantes:
    lista = []

    def __init__(self, nome, categoria):
        self._nome = nome
        self._categoria = categoria
        self._ava = []
        self._cardapio = []
        Restaurantes.lista.append(self)

    def __str__(self):
        return f'{self._nome} | {self._categoria} | Média: {self.media()}'

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

    def media(self):
        if not self._ava:
            return 'Sem Avaliações'
        soma = sum(avaliacao.nota for avaliacao in self._ava)
        quantidade = len(self._ava)
        total = round(soma / quantidade, 1)
        return total
    
    def adicionar(self, item):
        if isinstance(item, Item_Cardapio):
            self._cardapio.append(item)

    @property
    def mostrar_cardapio(self):
        print(f'\nCardápio do Restaurante {self._nome}\n')
        for i, item in enumerate(self._cardapio, start = 1):
            if hasattr(item, 'descricao'):
                mensagem_comida = f'{i}. Nome: {item._nome} | Preço: {item._preco} | Descrição: '
                print(mensagem_comida)
            else:
                mensagem_bebida = f'{i}. Nome: {item._nome} | Preço: {item._preco} | Tamanho: '
                print(mensagem_bebida)

pizza = Restaurantes('Pizza', 'Massa')
comida_pao = Comida('Pão', 6.00, 'O melhor pão da cidade')
pizza.receber('Pedro', 5)
pizza.receber('Marilia', 5)
pizza.receber('Felipe', 3)
pizza.adicionar(comida_pao)
bebida_melancia = Bebida('melancia', 5.00, 'médio')
pizza.adicionar(bebida_melancia)

pizza.mostrar_cardapio

Eu não preenchi a descrição e o tamanho só para fazer um teste.

Cardápio.py:

class Item_Cardapio:
    def __init__(self, nome, preco):
        self._nome = nome
        self._preco = preco


class Comida(Item_Cardapio):
    def __init__(self, nome, preco, descricao):
        super().__init__(nome, preco)
        self._descricao = descricao

    def __str__(self):
        return f'{self._nome} | {self._preco} | {self._descricao}'


class Bebida(Item_Cardapio):
    def __init__(self, nome, preco, tamanho):
        super().__init__(nome, preco)
        self._tamanho = tamanho

    def __str__(self):
        return f'{self._nome} | {self._preco} | {self._tamanho}'

No terminal aparece o seguinte:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O "Tamanho" se repete duas vezes. Isso quer dizer que o "hasattr" não está funcionando para a comida e está indo direto para o "else"

Vocês poderiam me ajudar? Obrigado!

2 respostas

Boa noite!

acredito que esteja entrando no else por que nao existe o atributo descricao na classe comida, existe _descricao

solução!

Já resolvi! O que estava errado era o underline que eu coloquei na parte:

self._descricao = descricao

O certo seria:

self.descricao = descricao

Obrigado pela dica! :-)