Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida.

@property
    def listar_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: {item._preco} | Descriçao: {item.descricao}'
                print(mensagem_prato)
            else:
                mensagem_bebida = f'{i}. Nome: {item._nome} | Preço: {item._preco} | Tamanho: {item.tamanho}'
                print(mensagem_bebida)

Neste código anteriormente os atributos 'item.tamanho e item.descricao' eu tinha colocado o underline neles, porém o código não funcionava depois fui nos arquivos retirei o underline e modifiquei para o jeito que esta agora, por que quando tinha o underline ele não funcionava?

1 resposta
solução!

O motivo do código não funcionar quando você adicionou o underline (por exemplo, item.tamanho ou item.descricao) nos atributos está relacionado ao conceito de encapsulamento em Python e como os atributos são acessados.

Em Python, um atributo com um único underline é considerado uma convenção para indicar que é "protegido" (isto é, não deve ser acessado diretamente fora da classe). Porém, ainda pode ser acessado diretamente pelo nome completo do atributo. Se o atributo foi definido como tamanho ou descricao na classe correspondente, você deve acessá-lo exatamente dessa forma (item.tamanho, por exemplo). Já sem o underline (tamanho ou descricao), você pode acessá-los diretamente com o nome simples (item.tamanho).

O problema ocorre porque o código tenta acessar item.tamanho ou item.descricao, mas os atributos definidos na classe têm nomes diferentes (tamanho ou descricao). Isso causa o erro AttributeError, pois o atributo "não existe" com o nome que você está tentando acessar.

Aí, quando você removeu o underline e definiu os atributos como tamanho e descricao, os nomes dos atributos passaram a coincidir exatamente com o que o código estava tentando acessar: item.tamanho e item.descricao. Ou seja, o erro parou de acontecer porque os atributos esperados e os definidos agora tinham o mesmo nome.

Não sei se fui muito clara, qualquer coisa, só me avisar que eu tento mudar a explicação!