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

Erros e Soluções (import, retorno de media_avaliações entre outros...)

Pessoal, vi aqui várias instruções que infelizmente não funcionaram inclusive do próprio video da aula, códigos baixados do git oficial do curso que não rodaram e etc. Em resumo estou achando um mini-curso repleto de erros. Seria legal que a Alura reveja este curso para corrigir os erros que os orientadores estão passando para os alunos. Pode ser que a versão utilizada no curso aceitasse o formado de sintaxe que utilizaram, mas pelo que estou enxergando para as versões 3+ não estão rolando.

Em fim, para os lindos aí que estiverem com problema ao executar a rotina abaixo:

   Restaurante.listar_restaurantes()

E estiver recebendo o seguinte retorno:

Nome do restaurante       | Categoria                 | Avaliação                 | Status
Praça                     | GOURMET                   | <bound method Restaurante.media_avaliacoes of <modelos.restaurante.Restaurante object at 0x000002155668FAA0>> | ☐
Mexican Food              | MEXICANA                  | <bound method Restaurante.media_avaliacoes of <modelos.restaurante.Restaurante object at 0x000002155668FDD0>> | ⌧
Japa                      | JAPONESA                  | <bound method Restaurante.media_avaliacoes of <modelos.restaurante.Restaurante object at 0x000002155668FB60>> | ☐

A solução para mim foi bem simples. Apenas incluir o parenteses na funçáo conforme inlustrado abaixo:

Antes:

f'{str(restaurante.media_avaliacoes).ljust(25)} | '

Depois:

f'{str(restaurante.media_avaliacoes()).ljust(25)} | '

Prontinho. Apenas isso.

Vou incluir aqui abaixo também todo o meu código e o link do git para baixarem correspondente até a aula "04. Composição" do módulo "Importando classe e composição".

link git: Clique aqui

Em app.py:

from modelos.restaurante import Restaurante
#-------------------------------------------------------------

restaurante_praca = Restaurante('praça', 'gourmet')
restaurante_mexicano = Restaurante('mexican food', 'Mexicana')
restaurante_japones = Restaurante('japa', 'Japonesa')

#-------------------------------------------------------------
def main():
    print("-----------------------------------------------")

    restaurante_praca.receber_avaliacao('Gui', 10)
    restaurante_praca.receber_avaliacao('Lais', 8)
    restaurante_praca.receber_avaliacao('Emy', 5)
    restaurante_mexicano.alternar_status()
    Restaurante.listar_restaurantes()

    print("-----------------------------------------------")

if __name__ == '__main__':
    main()

Em modelos/restaurante.py:

# from avaliacao import Avaliacao # Error
from .avaliacao import Avaliacao # OK!

class Restaurante:
    restaurantes = []

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

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

    @property
    def ativo(self):
        return '⌧' if self._ativo else '☐'

    @classmethod
    def listar_restaurantes(cls):
        print(f'{"Nome do restaurante".ljust(25)} | '
              f'{"Categoria".ljust(25)} | '
              f'{"Avaliação".ljust(25)} | '
              f'{"Status"}')

        for restaurante in cls.restaurantes:
            print(f'{restaurante._nome.ljust(25)} | '
                  f'{restaurante._categoria.ljust(25)} | '
                  # f'{str(restaurante.media_avaliacoes).ljust(25)} | ' # Error
                  f'{str(restaurante.media_avaliacoes()).ljust(25)} | ' # OK!
                  f'{restaurante.ativo}')

    def alternar_status(self):
        self._ativo = not self._ativo

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

    # @property  # Error
    # @property  # Comentar, não utilizar o @property... OK!
    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

Em modelos/avaliacao.py:

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

Protinho meus amores. Espero que ajude. #tmj

2 respostas

Oii, Marcio, tudo bem?

Obrigada por compartilhar com a gente a sua sugestão.

E obrigada também pela sua sugestão sobre o curso.

Abraços!

solução!

Olá Maria, obrigado. Aproveitando, em contato com o Renan ele me sugeriu uma melhoria aplicando as boas práticas e ao fazer alguns testes, concordei com ele.

Segue abaixo a sugestão de melhoria aplicando as boas práticas sem comentar o @property.

Ficaria da seguinte forma apenas nas alterações:

Alterar a seguinte linha do método listar_restaurantes():

antes:

f'{str(restaurante.media_avaliacoes()).ljust(25)}

depois (apenas retirar os parenteses, dessa forma não chamando o método diretamente):

f'{str(restaurante.media_avaliacoes).ljust(25)} | '

E alterar também o método media_avaliacoes(self):.

antes:

    # @property  # Error
    # @property  # Comentar, não utilizar o @property... OK!
    def media_avaliacoes(self):

depois (habilitando o @property, dessa forma aplicamos uma boa prática para não chamar o método diretamente):

    @property
    def media_avaliacoes(self):

Prontinho, eu testei e funcionou perfeitamente. Dessa forma teremos a seguinte saída:

-----------------------------------------------
Nome do restaurante       | Categoria                 | Avaliação                 | Status
Praça                     | GOURMET                   | 5.0                       | ☐
Mexican Food              | MEXICANA                  | -                         | ⌧
Japa                      | JAPONESA                  | -                         | ☐
-----------------------------------------------