Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Reclamação] corte na sequencia de conteúdo

No fim da aula de "2.metodos para adicionar item" nao houve um fechamento, nao verificamos o resultado daquelas implementacoes; quando a professora menciona em visualizar o resultado das ultimas alteracoes o outro professor diz que tem uma ideia, que vamos conferir no video seguinte. Mas no video seguinte houve um corte direto para refatoracao. Detalhe: no meu terminal aquelas alteracoes que nao foram visualisadas, antes de pular para refatoracao, deu erro no terminal.
uma maravilha

1 resposta

Olá, Daniel. Como vai?

É realmente muito frustrante quando há um corte na sequência dos vídeos e o conteúdo avança sem que possamos visualizar o resultado prático das implementações que acabamos de fazer — especialmente quando o código apresenta um erro no terminal antes mesmo de podermos avançar para a etapa de refatoração.

Obrigado por registrar esse feedback aqui no fórum. Esse tipo de retorno é muito importante para que a equipe de conteúdo possa revisar as transições de edição das aulas e garantir que a linha de raciocínio nunca seja quebrada.

Para que você não fique travado nessa etapa e consiga resolver o erro do seu terminal antes de seguir para os próximos passos, vou te ajudar a debugar o código. Nesse ponto do curso (envolvendo a criação do cardápio com Prato e Bebida), existem três fontes de erro muito comuns que costumam quebrar a execução.

Abaixo, apresento como o seu código deve estar estruturado para funcionar corretamente:

1. O método adicionar_no_cardapio na classe Restaurante

Verifique se a sua classe Restaurante (geralmente no arquivo restaurante.py) possui o atributo do cardápio inicializado como uma lista vazia no construtor e se o método de inserção está validando a herança corretamente com o isinstance:

from modelos.cardapio.item_cardapio import ItemCardapio

class Restaurante:
    def __init__(self, nome, categoria):
        self._nome = nome.title()
        self._categoria = categoria.upper()
        self._ativo = False
        self._cardapio = []  # Inicialização da lista do cardápio

    def adicionar_no_cardapio(self, item):
        # Valida se o item herda de ItemCardapio antes de adicionar
        if isinstance(item, ItemCardapio):
            self._cardapio.append(item)

2. A herança nas classes Prato e Bebida

As classes filhas precisam chamar o construtor da classe mãe (ItemCardapio) utilizando o método super(). Certifique-se de que as importações e os atributos protegidos (com o sublinhado _) estão corretos:

  • No arquivo 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
  • No arquivo 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

3. O erro de atributo ao exibir o cardápio (AttributeError)

O erro mais comum que acontece no terminal logo após implementar os métodos de adicionar itens é o AttributeError.

Isso acontece porque, ao tentar listar as informações de cada item do cardápio dentro de um laço de repetição, a classe Bebida não possui o atributo _descricao (que é exclusivo de Prato), e a classe Prato não possui o atributo _tamanho (que é exclusivo de Bebida).

Se tentarmos acessar esses atributos diretamente no laço de repetição, o terminal vai disparar um erro e derrubar a aplicação. Para contornar isso antes de realizar a refatoração polimórfica definitiva, utilizamos a função embutida do Python hasattr() para verificar se o atributo existe no objeto:

    @property
    def exibir_cardapio(self):
        print(f"Cardápio do restaurante {self._nome}\n")
        for i, item in enumerate(self._cardapio, start=1):
            # Verifica se o item possui o atributo correspondente a Prato
            if hasattr(item, '_descricao'):
                print(f"{i}. Nome: {item._nome} | Preço: R${item._preco} | Descrição: {item._descricao}")
            else:
                print(f"{i}. Nome: {item._nome} | Preço: R${item._preco} | Tamanho: {item._tamanho}")

Confira se a nomenclatura das suas pastas de importação no arquivo principal (como app.py) está com todas as letras minúsculas (pois o Python é sensível a maiúsculas e minúsculas) e se as referências dos atributos estão batendo com os arquivos de classe correspondentes.

Caso o seu erro persista no console, compartilhe aqui a mensagem de erro completa (o Traceback) que o terminal exibe para que possamos identificar o ponto exato da falha no seu código.

Espero que possa ter lhe ajudado!