Attributeerror: 'Cursoprogramming' Object has no attribute '_valuations'

Asked

Viewed 5,585 times

1

I’m developing a little Python "online course site" system, and there’s an error that, at least for me, doesn’t make sense.

Follows the code:

from src.site.classes_de_alunos_e_professores import Professor  # O único parâmetro do construtor dessa classe é o nome


class Curso:

    def __init__(self, nome, aulas, professor, preco):
        self._nome = nome
        self._aulas = aulas
        self._professor = professor
        self._nota = self.nota_media()
        self._avaliacoes = []  # Existe uma classe chamada Aluno que está em outro arquivo (o mesmo do Professor),
        # que omiti dessa pergunta por dar espaço a esse código que já é extenso. Se for necessário posto nos
        # comentários. O aluno pode avaliar o curso com uma nota float e sua 
        # avaliação cai (ou deve cair) automaticamente na lista.
        self._preco = preco

    @property
    def nome(self):
        return self._nome

    @property
    def aulas(self):
        return self._aulas

    @property
    def professor(self):
        return self._professor

    @property
    def nota(self):
        return self._nota

    @property
    def preco(self):
        return self._preco

    @property
    def avaliacoes(self):
        return self._avaliacoes

    def nota_media(self):

        if not self._avaliacoes:
            return "O curso ainda não foi avaliado"

        else:
            soma_das_notas = 0
            for nota in self.avaliacoes:
                soma_das_notas = sum(nota)

            media = soma_das_notas/len(self._avaliacoes)

            return media


class CursoProgramacao(Curso):
    def __init__(self, nome, aulas, linguagem, professor, preco):
        super().__init__(nome, aulas, professor, preco)
        self._nome = nome
        self._aulas = aulas
        self._linguagem = linguagem
        self._professor = professor
        self._nota = self.nota_media()
        self._avaliacoes = []
        self._preco = preco

    def __str__(self):
        print(f"Nome do curso: {self._nome}; Nº de aulas: {self.aulas}; Tipo: Programação; "
              f"Linguagem: {self._linguagem}; Professor: {self._professor.nome}; "
              f"Nota: {self._nota}; Nº de avaliações: {len(self._avaliacoes)}; Preço: R${self._preco}")


class CursoDesign(Curso):
    def __init__(self, nome, aulas, ferramenta, professor, preco):
        super().__init__(nome, aulas, professor, preco)
        self._nome = nome
        self._aulas = aulas
        self._ferramenta = ferramenta
        self._professor = professor
        self._nota = self.nota_media()
        self._avaliacoes = []
        self._preco = preco

    def __str__(self):
        print(f"Nome do curso: {self._nome}; Nº de aulas: {self._aulas}; Tipo: Design; Ferramenta: {self._ferramenta};"
              f" Professor: {self._professor.nome}; Nota: {self._nota}; Nº de avaliações: {len(self._avaliacoes)}; "
              f"Preço: R${self._preco}")


class CursoMobile(Curso):
    def __init__(self, nome, aulas, so, professor, preco):
        super().__init__(nome, aulas, professor, preco)
        self._nome = nome
        self._aulas = aulas
        self._so = so
        self._professor = professor
        self._nota = self.nota_media()
        self._avaliacoes = []
        self._preco = preco

    def __str__(self):
        print(f"Nome do curso: {self._nome}; Nº de aulas: {self._aulas}; Tipo: Mobile; SO: {self._so};"
              f" Professor: {self._professor.nome}; Nota: {self._nota}; Nº de avaliações: {len(self._avaliacoes)};"
              f" Preço: R${self._preco}")

    professor = Professor("Marcos")

    curso = CursoProgramacao("Python 3", 9, "Python", professor, 130.0)

    print(curso)

And the mistake I get is:

Traceback (most recent call last):
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 87, in <module>
    class CursoMobile(Curso):
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 105, in CursoMobile
    curso = CursoProgramacao("Python 3", 9, "Python", professor, 130.0)
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 55, in __init__
    super().__init__(nome, aulas, professor, preco)
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 10, in __init__
    self._nota = self.nota_media()
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 40, in nota_media
    if not self._avaliacoes:
AttributeError: 'CursoProgramacao' object has no attribute '_avaliacoes'

Process finished with exit code 1

1 answer

3


self._nota = self.nota_media()
self._avaliacoes = []

You’re calling nota_media() before initializing _avaliacoes. That way when you fall into condition if not self._avaliacoes, an exception is made because self._avaliacoes does not yet exist.

If in addition to checking if the list is empty, you also wanted me to check if _avaliacoes already exists, should use

if not hasattr(self, '_avaliacoes') or not self._avaliacoes:
  • Opa, it worked. I also edited the structure of the self. _note and changed all the classes they inherited from "Curso". But now gave another error. I am new here, so I do not know the rules of conduct right. I must open a new topic?

  • 2

    @Padawan_22 If this answer solved the problem that is indicated in your question, you can accept it (see here how to do this). Then you can ask another question with the new doubt. This is the idea of the site: a question for each specific problem (even if they are related, each question should be "self-contained"). For more details, see the page [Ask] and the help center

Browser other questions tagged

You are not signed in. Login or sign up in order to post.