3
respostas

[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)
3 respostas

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 ✓.

Estou com o mesmo problema do colega, porém minha função exibir_cardapio já está dentro da Class Restaurante, estamos usando @property nesse metódo por orientação dos professores na aula, se isso está errado, algo tem que ser revisto nessa forma de ensino.

Bom dia, Klenio! Tudo joia?

Poderia abrir um novo tópico compartilha mais informações sobre o seu problema? Como prints ou até mesmo o compartilhamento de todo o seu código.

Pois, mesmo que o problema do colega seja parecido com o seu, a causa pode ser diferente. Então, é mais interessante para você que tratarmos o seu caso com mais exclusividade.

No mais, bons estudos!