1
resposta

[Bug] Está aparecendo um erro

Já vasculhei o código e não consigo achar o erro.

Traceback (most recent call last):
  File "C:\Users\User\Desktop\python-OO-API\app.py", line 8, in <module>     
    restaurante_praca.adicionar_no_cardapio(bebida_suco)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Restaurante' object has no attribute 'adicionar_no_cardapio'``
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'Cardápio 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 = mensagem_prato = f'{i}. Nome: {item._nome} | Preço: R${item._preco} | Tamanho: {item.tamanho}'
            print(mensagem_bebida)
1 resposta

Olá! Tudo bem?

O erro de AttributeError diz que o objeto 'Restaurante' não tem o atributo 'adicionar_no_cardapio'. Isso acontece porque o método adicionar_no_cardapio não está definido dentro da classe Restaurante, mas sim fora dela no seu código.

Para corrigir esse problema, você precisa mover a definição do método adicionar_no_cardapio para dentro da classe Restaurante. Aqui está como você pode fazer isso:

class Restaurante:
    # Seus outros métodos e propriedades

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

Certifique-se de que o método adicionar_no_cardapio esteja corretamente indentado para fazer parte da classe Restaurante. Isso deve resolver o erro que você está enfrentando.

Além disso, notei que você tem um método exibir_cardapio definido como uma propriedade, mas ele realiza ações de impressão, o que geralmente não é recomendado para propriedades. Propriedades são tipicamente usadas para acessar dados, não para executar ações. Seria mais adequado definir exibir_cardapio como um método normal sem o decorador @property.

Espero ter ajudado e bons estudos!

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

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software