2
respostas

não estou conseguindo transformar a média da avaliação em string

Boa noite! tudo bem? Meu código esta igual o da aula e no começo não estava conseguindo transforma-lo em string aparecendo apenas onde o arquivo estava guardado. e está dando outro erro que não entendo o por que, ele esta mostrando isso:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

meu código está exatamente igual o da aula

app.py:

from modelos.restaurante import Restaurante

restaurante_praca = Restaurante('Praça', 'Gourmet')
restaurante_praca.receber_avaliacao('mari', 10)
restaurante_praca.receber_avaliacao('mamãe', 6)
restaurante_praca.receber_avaliacao('tonton', 8)


def main():
    Restaurante.listar_restaurantes()

if __name__ == '__main__':
    main()

restaurante.py:

from modelos.avaliacao import Avaliacao 

class Restaurante:
    restaurantes = []

    def __init__(self, nome, categoria):
        self._nome = nome.capitalize()
        self._categoria = categoria.upper()
        self._ativo = False  
        self._avaliacao = []
        Restaurante.restaurantes.append(self)  

    def __str__(self):
        return f'{self._nome} | {self.categoria}'

    @classmethod
    def listar_restaurantes(cls):
        print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliação'.ljust(25)} | {'Status'}')
        for restaurante in Restaurante.restaurantes:
            print(f'{restaurante._nome.ljust(25)} | {restaurante._categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.ativo}')

    @property
    def ativo(self):
        return '☑' if self._ativo else '☐'
    @property
    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_avaliacoes(self):
        if not self._avaliacao:
            return 0
        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, 1)
        return media

avaliaçao.py:

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

Olá, Mariana. Como vai?

O erro que você está enfrentando é muito comum quando estamos aprendendo Orientação a Objetos em Python. O terminal está avisando que o "objeto do tipo tipo" (a classe) não tem o atributo _nota, e isso acontece por um pequeno detalhe na hora de guardar os dados.

No seu arquivo restaurante.py, dentro do método receber_avaliacao, você está cometendo o seguinte equívoco:

def receber_avaliacao(self, cliente, nota):
    avaliacao = Avaliacao(cliente, nota) # Aqui você criou a instância (correto)
    self._avaliacao.append(Avaliacao)    # ERRO: Aqui você guardou a CLASSE com "A" maiúsculo
  • Quando você usa self._avaliacao.append(Avaliacao), você está adicionando a classe (o molde) dentro da lista, e não o objeto que você acabou de criar. *
  • Como a classe em si não possui uma nota (quem possui a nota é o objeto específico), o Python gera o erro AttributeError ao tentar somar os valores na sua função de média. *

Como corrigir:

Basta alterar a linha do append para usar a variável com letra minúscula (a instância que você criou na linha de cima):

def receber_avaliacao(self, cliente, nota):
    avaliacao = Avaliacao(cliente, nota)
    self._avaliacao.append(avaliacao) # Agora você está guardando o objeto correto!

Quanto à sua dúvida sobre transformar em string, no Python, quando você usa o decorador @property, você não precisa chamar o método com parênteses. No seu print dentro de listar_restaurantes, o código str(restaurante.media_avaliacoes) deverá funcionar perfeitamente assim que a lista estiver com os objetos corretos, retornando o número formatado.

Espero que possa ter lhe ajudado!

agora ela está mostrando o erro:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
``