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:
from modelos.cardapio.item_cardapio import ItemCardapio
class Prato(ItemCardapio):
def __init__(self, nome, preco, descricao):
super().__init__(nome, preco)
self._descricao = descricao
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!