1
resposta

Atributo Privado

Sobremesa.py

from modelos.cardapio.item_cardapio import ItemCardapio

class Sobremesa(ItemCardapio):
    def __init__(self, nome, preco, tipo, tamanho):
        super().__init__(nome, preco)
        self.tipo = tipo
        self.tamanho = tamanho
    
    def __str__(self):
        return self._nome
    
    def aplicar_desconto(self):
        self._preco -= (self._preco * 0.1)

Restaurante.py

def exibir_cardapio(self):
    print(f'Cardapio 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)
        elif hasattr(item, 'tipo'):
            mensagem_sobremesa = f'{i}. Nome: {item._nome} | Preço: R$ {item._preco} | Tipo: {item.tipo} | Tamanho: {item.tamanho}'
            print(mensagem_sobremesa)
        else:
            mensagem_bebida = f'{i}. Nome: {item._nome} | Preço: R$ {item._preco} | Tamanho: {item.tamanho}'
            print(mensagem_bebida)

Implementei desta forma, mas não sei se é a melhor das convenções. Porém, estou com dúvida no porque não podemos usar atributos privados no descrição, tipo e tamanho? Sempre que eu tentava utilizar, meu código quebrava.

Apenas comentando da minha lógica, pensei em usar o "Elif" para conseguir exibir o tipo e tamanho da sobremesa. Qual seria outra forma de exibir eles?

1 resposta

Oii Osmar, tudo bem?

Sobre a sua implementação e a utilização de atributos privados, realmente essa é uma questão interessante na programação orientada a objetos em Python. Em Python, atributos privados são definidos com dois sublinhados iniciais (por exemplo, __nome). Quando você tenta acessar esses atributos fora da classe em que foram definidos, como você observou, ocorre um erro. Isso acontece porque o Python realiza um name mangling, que altera o nome do atributo para incluir o nome da classe, tornando-o inacessível diretamente pelo seu nome original.

Quanto à sua lógica com o uso de elif para exibir o tipo e tamanho da sobremesa, ela tá correta e é uma forma eficiente de verificar a presença de atributos específicos e exibir informações com base nisso.

Uma alternativa seria usar polimorfismo, definindo um método __str__ ou similar em cada classe derivada (como Sobremesa e outras que possam existir, como Bebida) para retornar a string formatada específica daquela classe. Isso reduziria a necessidade de verificações explícitas no código que exibe o cardápio, tornando-o mais modular e fácil de manter.

Um abraço e bons estudos.