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

[Dúvida] AttributeError ocorrendo com 'tamanho'

Se eu tento executar o app.py dá o seguinte erro:

AttributeError: 'Bebida' object has no attribute 'tamanho'. Did you mean: '_tamanho'?

Ele chega a executar parte do código, já que aparece o print 'Cardapio do Restaurante Praça' acima do erro Ai se eu sigo essa dica e mudo 'tamanho' pra '_tamanho' o erro vira:

AttributeError: 'Prato' object has no attribute '_tamanho'

Código do app.py:

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.0, 'Grande')
prato_paozinho = Prato('Pãozinho', 2.0, 'O melhor pão da cidade')
restaurante_praca.adicionar_no_cardapio(bebida_suco)
restaurante_praca.adicionar_no_cardapio(prato_paozinho)

def main():
    restaurante_praca.exibir_cardapio

if __name__ == '__main__':
    main()

Restaurante.py:

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)

    @property
    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)

bebida.py:

from modelos.cardapio.item_cardapio import ItemCardapio

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

    def __str__(self):
        return self._nome

prato.py:

from modelos.cardapio.item_cardapio import ItemCardapio

class Prato(ItemCardapio):
    def __init__(self, nome, preco, descricao):
        super().__init__(nome,preco)
        self.descricao = descricao

    def __str__(self):
        return self._nome
1 resposta
solução!

Bom dia Vinicius! Tudo bem com você?

O erro está sendo apresentado devido a um pequeno erro no código de verificação se o objeto possui o atributo descricao. No método exibir_cardapio da classe Restaurante, está sendo verificado se o item possui o atributo privado _descricao (com o sublinhado na frente) o correto é verificar se o item possui o atributo descricao (sem o sublinhado na frente). Como apresentado abaixo:

if hasattr(item, 'descricao'):

Essa mudança é importante pois tanto na classe Prato quanto Bebida esse atributo não é privado.

Após realizar a correção, salve o arquivo "restaurante.py" e execute o arquivo app.py. No GIF abaixo apresento a correção e execução do código:

GIF apresentando a execução e correção do código do estudante

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

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