3
respostas

[Bug] Não conseguindo exibir cardápio

arquivo restaurant.py

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

    @property
    def exibir_cardapio(self):
        print(f'Cardápio do restaurante: {self._name}\n')

        for i, item in enumerate(self._cardapio, start=1):
            if hasattr(item, 'description'):
                msg_prato = f'{i} - Nome: {item._name} | Preço: {item._price} | Descrição: {self._description}'
                print(msg_prato)
            else:
                msg_bebida = f'{i} - Nome: {item._name} | Preço: {item._price} | Tamanho: {self._size}'
                print(msg_bebida)

arquivo prato.py

class Prato(ItemCardapio):
    def __init__(self, name, description, price):
        super().__init__(name, price)
        self._description = description

    def __str__(self):
        return self._name

arquivo bebidas.py

class Bebida(ItemCardapio):
    def __init__(self, name, size, price=int):
        super().__init__(name, price)
        self._size = size

    def __str__(self):
        return self._name

arquivo app.py

from models.restaurant import Restaurant
from models.cardapio.bebidas import Bebida
from models.cardapio.prato import Prato

restaurant_praca = Restaurant('praça', 'Gourmet')
bebida_suco = Bebida('Melancia', 5, 'grande')
prato_pao = Prato('Pão', 2, 'O melhor pão da cidade')


restaurant_praca.add_itens_no_cardapio(bebida_suco)
restaurant_praca.add_itens_no_cardapio(prato_pao)


def main():
    restaurant_praca.exibir_cardapio


if __name__ == '__main__':
    main()

Erro que está aparecendo no terminal:

AttributeError: 'Restaurant' object has no attribute '_size'

3 respostas

Olá Willian!

Espero que esteja bem, aparentemente sua classe Restaurant não tem essa função como descrito no seu arquivo. Frequentemente as classes podem estender ou herdar, o que já mudaria a situação.

Pode postar a classe Restaurant completa aqui para verificarmos?

Se achar interessante pode enviar um link de github que dou uma olhada para você.

Abraços!

Código completo da class Restaurant

from models.rating import Rating
from models.cardapio.item_cardapio import ItemCardapio


class Restaurant():
    restaurants = []

    def __init__(self, name, category):
        self._name = name.title()
        self._category = category.upper()
        self._active = False
        self._cardapio = []
        self._rating = []

        Restaurant.restaurants.append((self))

    def __str__(self):
        return f'{self._name} | {self._category}'

    @classmethod
    def listing_restaurants(cls):
        print(f'{'Nome do restaurante'.ljust(25)} {'Categoria'.ljust(25)} {'Avaliação'.ljust(25)} {'Status'}')
        for restaurent in cls.restaurants:
            print(f'{restaurent._name.ljust(25)} | {restaurent._category.ljust(25)} | {str(restaurent.media_rating).ljust(25)} | {restaurent._active}')

    @property
    def activity(self):
        status = '✓' if not self._active else '☓'
        return status

    def switch_status(self):
        self._active = not self._active

    def get_rating(self, client, note):
        if 0 < note <= 5:
            rating = Rating(client, note)
            self._rating.append(rating)

    @property
    def media_rating(self):
        if not self._rating:
            return '-'
        media = round(
            sum(rating._note for rating in self._rating) / len(self._rating), 1)
        return media

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

    @property
    def exibir_cardapio(self):
        print(f'Cardápio do restaurante: {self._name}\n')

        for i, item in enumerate(self._cardapio, start=1):
            if hasattr(item, 'description'):
                msg_prato = f'{i} - Nome: {item._name} | Preço: {item._price} | Descrição: {self._description}'
                print(msg_prato)
            else:
                msg_bebida = f'{i} - Nome: {item._name} | Preço: {item._price} | Tamanho: {self._size}'
                print(msg_bebida)

Willian, boa noite!

Realmente na sua classe Restaurant não há o item "_size". Defina na classe ou herde de uma classe que contenha o "_size" e esse erro será tratado.

Outro ponto parecido que encontrei é que na classe Bebida não existe "_name" a menos que seja herdada da classe ItemCardapio

class Bebida(ItemCardapio):
    def __init__(self, name, size, price=int):
        super().__init__(name, price)
        self._size = size

    def __str__(self):
        return self._name # nesse contexto não existe "_name" a menos que seja herdada da classe ItemCardapio)

Espero ter ajudado. Em caso positivo marque o tópico como solucionado.

Abraço!