Boa noite, envio o algoritmo das alterações que fiz para o exercício. Feedbacks de boas práticas são bem-vindos.
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.get_nome
@property
def get_tipo(self):
return self._tipo
@property
def get_tamanho(self):
return self._tamanho
def aplicar_desconto(self):
self._preco -= (self._preco * 0.1)
restaurante.py
from modelos.avaliacao import Avaliacao
from modelos.cardapio.item_cardapio import ItemCardapio
from modelos.cardapio.prato import Prato
from modelos.cardapio.bebida import Bebida
from modelos.cardapio.sobremesa import Sobremesa
class Restaurante:
''''Representa a um restaurante e suas características'''
restaurantes = []
def __init__(self, nome, categoria): #self é uma convenção, mas poderia ser chamado de objeto ou this
'''
Inicializa uma instância de Restaurante.
Parâmetros:
- nome (str): o nome do Restaurante
- categoria (str): categoria do restaurante
'''
self._nome = nome.title()
self._categoria = categoria.upper()
self._ativo = False
self._avaliacao = []
self._cardapio = []
Restaurante.restaurantes.append(self)
def __str__(self):
'''
Retorna uma representação em str do restaurante
'''
return f'{self._nome.ljust(25)} | {self._categoria.ljust(25)} | {self.ativo}'
@classmethod
def listar_restaurantes(cls):
'''
Exibe uma lista formada de todos os restaurantes
'''
print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Média'.ljust(25)} | {'Status'.ljust(25)}')
for restaurante in cls.restaurantes:
print (f'{restaurante._nome.ljust(25)} | {restaurante._categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.ativo}') #media_avaliacoes vem do método
@property
def ativo(self):
'''Retorna um símbolo indicando '''
return '☑' if self._ativo else '☐'
def alternar_estado(self):
'''Alterna o estado de disponibilidade do restaurante'''
self._ativo = not self._ativo
def receber_avaliacao(self,cliente, nota):
'''Regitra uma avaliação para a instância de Restaurante
Parâmetros:
- cliente (str) = nome do Cliente
- nota (float) = nota atribuída ao restaurante pelo Cliente
'''
avaliacao = Avaliacao(cliente,nota)
self._avaliacao.append(avaliacao)
@property
def media_avaliacoes(self):
'''
Calcula e retorna a média de avaliações:
- média da nota dividido por 2 (já que os clientes dão nota de 1 a 10 mas o aplicativo exibe de 1 a 5)
- mensagem de aviso (str) caso não haja avaliações
'''
if not self._avaliacao:
return 'SEM AVALIAÇÃO'
else:
soma_das_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
quantidade_de_notas = len(self._avaliacao)
media = round((soma_das_notas / quantidade_de_notas)/2, 1) #1 é a quantidade de dígitos depoiss da vírgula
return media
def adicionar_no_cardapio(self,item):
if isinstance(item, ItemCardapio): #is True é subentendido no if
self._cardapio.append(item)
@property
def exibir_cardapio(self):
print(f'Cardápio do restaurante: {self._nome}\n')
for i,item in enumerate(self._cardapio,start=1):
#poderia ser for i,item in enumerate(ItemCardapio.item_cardapio,start=1):
#se a classe houver um vetor com as iterações criadas
# if hasattr(item,'get_descricao'): (também pode ser desse jeito)
if isinstance(item, Prato):
mensagem = f'{i}. Nome: {item.get_nome} | Preço: {item.get_preco:.2f} | Descrição: {item.get_descricao}'
elif isinstance(item,Sobremesa):
mensagem = f'{i}. Nome: {item.get_nome} | Preço: {item.get_preco:.2f} | Tipo: {item.get_tipo} | Tamanho: {item.get_tamanho}'
else:
mensagem = f'{i}. Nome: {item.get_nome} | Preço: {item.get_preco:.2f} | Tamanho: {item.get_tamanho}'
print(mensagem)