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

[Bug] Erro AttributeError:

from modelos.avaliacao import Avaliacao


class Loja: 
    lojas = []

    def __init__(self, nome, categoria):
        self._nome = nome.title()
        self._categoria = categoria.upper()
        self._ativo = False
        self._avaliacao = []
        Loja.lojas.append(self)

    def __str__(self):
        return f'{self._nome} | {self._categoria}'
    
    @classmethod
    def listar_lojas(cls):
        print(f'{'Nome do Restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliações'.ljust(25)} | {'Status'}')
        for loja in cls.lojas:
            print(f'{loja._nome.ljust(25)} | {loja._categoria.ljust(25)} | {str(loja.media_avaliacoes).ljust(25)} | {loja._ativo}')

    @property 
    def ativo(self):
      return 'Verdadeiro' if self._ativo else 'Falso'   
       
    def alternado_status(self):
      self._ativo = not self._ativo 
    
    def receber_avaliação(self, cliente, nota):
        avaliacao = Avaliacao(cliente, nota)
        self._avaliacao.append(avaliacao)

    @property
    def media_avalicoes(self):
     if not self._avalicao:
         return 0
     soma_das_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
     quantidade_de_notas = len(self._ativo)
     media = round(soma_das_notas / quantidade_de_notas, 1)
     return media 

Depos de executa o codigo, fica aparecendo esse erro

Traceback (most recent call last):
  File "C:\Users\Adriel\Workspace\oo-nuvem-shop\loja2.py", line 17, in <module>
    main()
    ~~~~^^
  File "C:\Users\Adriel\Workspace\oo-nuvem-shop\loja2.py", line 6, in main
    Loja.listar_lojas()
    ~~~~~~~~~~~~~~~~~^^
  File "C:\Users\Adriel\Workspace\oo-nuvem-shop\modelos\loja.py", line 22, in listar_lojas
    print(f'{loja._nome.ljust(25)} | {loja._categoria.ljust(25)} | {str(loja.media_avaliacoes).ljust(25)} | {loja._ativo}')
                                                                        ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Loja' object has no attribute 'media_avaliacoes'. Did you mean: 'media_avalicoes'?
PS C:\Users\Adriel\Workspace\oo-nuvem-shop> 
1 resposta
solução!

Olá, Adriel!

O problema que você está enfrentando é devido a uma inconsistência no nome da propriedade. A solução: você precisa renomear a propriedade media_avalicoes para media_avaliacoes (adicionando um "a" ao nome).

  1. Na definição da propriedade:

    Altere a linha:

    @property
    def media_avalicoes(self):
        # ...
    

    Para:

    @property
    def media_avaliacoes(self):
        # ...
    
  2. Na chamada da propriedade:

    Mantenha a linha:

    print(f'{loja._nome.ljust(25)} | {loja._categoria.ljust(25)} | {str(loja.media_avaliacoes).ljust(25)} | {loja._ativo}')
    

    Como está.

Lembre-se de corrigir o erro na propriedade media_avaliacoes:

Na linha quantidade_de_notas = len(self._ativo), você está usando len(self._ativo), mas deveria ser len(self._avaliacao) para obter o número de avaliações.

Código com as modificações:

from modelos.avaliacao import Avaliacao

class Loja: 
    lojas = []

    def __init__(self, nome, categoria):
        self._nome = nome.title()
        self._categoria = categoria.upper()
        self._ativo = False
        self._avaliacao = []
        Loja.lojas.append(self)

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

    @classmethod
    def listar_lojas(cls):
        print(f"{'Nome do Restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliações'.ljust(25)} | {'Status'}")
        for loja in cls.lojas:
            print(f'{loja._nome.ljust(25)} | {loja._categoria.ljust(25)} | {str(loja.media_avaliacoes).ljust(25)} | {loja._ativo}')

    @property 
    def ativo(self):
      return 'Verdadeiro' if self._ativo else 'Falso'   
       
    def alternado_status(self):
      self._ativo = not self._ativo 
    
    def receber_avaliação(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) # Corrigido aqui
        media = round(soma_das_notas / quantidade_de_notas, 1)
        return media

Espero ter ajudado.