Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Parse para float do atributo avaliacao.nota

Boa noite, apesar do meu codigo estar fucionando bem, gostaria de entender o porque tive que passar para float o meu atributo e o professor não. Sei que para utilizar o Sum não se pode utilizar strings, por isso o parse para o float. Mas não vi o professor realizar esse parse e o codigo funcionou. Gostaria de perceber melhor se há outro jeito de utilizar o sum.

classe restaurante

import os
import csv
from Modelos.avaliacao import Avaliacao

class Restaurante:

    restaurantes = []

    def __init__(self, nome,categoria):
        
        self._nome = nome.title()
        self._categoria = categoria.title()
        self._ativo = False
        self._avaliacao = []
        Restaurante.restaurantes.append(self) # faz o append  do proprio restaurante    
    
    def __str__(self):
        return f"{self._nome} | {self._categoria}"
    
    @classmethod
    def listar_restaurantes(cls):

        print(f"{'Nome'.ljust(22)} | {'Categoria'.ljust(22)} | {'Avaliação'.ljust(25)} | Status")
        for restaurante in cls.restaurantes:
            print(f"{restaurante._nome.ljust(22)} | {restaurante._categoria.ljust(22)} | {str(restaurante.media_avaliacao).ljust(25)} | {restaurante.ativo}")

    @property
    def ativo(self):
        return'✅'if self._ativo else '❎'
    

    def alternar_estado(self):
        self._ativo = not self._ativo
    
    def receber_avaliacao(self,cliente,nota):
        avaliacao = Avaliacao(cliente,nota)
        self._avaliacao.append(avaliacao)

    @property
    def media_avaliacao(self):
        if not self._avaliacao:
            return 0
        
        # soma_das_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
        soma_das_notas = sum(float(avaliacao._nota) for avaliacao in self._avaliacao)
        qtd_notas =len(self._avaliacao)
        media = round(soma_das_notas / qtd_notas, 1)
        return media

classe avaliação

class Avaliacao:
    def __init__(self,cliente,nota):
        self._cliente = cliente
        self._nota = nota

main

from Modelos.restaurante import Restaurante

restaurante_01 = Restaurante('Sparrow','Marine')
# restaurante_02 = Restaurante('Tanjiro','Japanese')
# restaurante_03 = Restaurante('Bulls','Vegan')

restaurante_01.alternar_estado()
restaurante_01.receber_avaliacao('jay','10')
restaurante_01.receber_avaliacao('law','10')

def main():
    Restaurante.listar_restaurantes()

if __name__ == '__main__':
    main()

Desde já agradeço.

4 respostas

Olá boa noite!

você precisou usar o float na soma das notas porque passou a nota como string na hora de receber a avaliação.

você poderia tratar a nota na coasse avaliação para gatantir que nota sempre vai ser um inteiro ou float

Obrigado Edilson pela dica, mas sabe me dizer se o professor fez isso? fiquei curioso sobre o jeito que ele fez.

solução!

Olá Boa noite! Quando se declara entre aspas simples ' ' ou aspas duplas '' '' você está declarando como string, para passar como int, deve apenas digitar o número. Na aula, o professor passou apenas os números, sem aspas.

Obrigado Matheus.

Resumindo: Podemos passar de duas formas:

nota = 0 self._nota = int(nota) (me parece redundante esta situação)

e converter na saída para int ou para o tipo str pois o metodo l.just() não aceita o float

mesmo assim agradeço.