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

AttributeError: 'CursoProgramacao' object has no attribute '_avaliacoes'

Edit1: A categoria do tópico está errada, perdão pelo erro.

Como expressei em um tópico anterior do fórum, estou desenvolvendo um pequeno sistema de "site de cursos" com o objetivo de praticar. Ontem me deparei com um erro que, pelo menos na minha cabeça, não faz sentido.

Ocultei outros códigos que fazem parte do sistema para o código principal caber aqui. Se for necessário, enviarei-os nos comentários.

Código principal:

from src.banco.classes_banco import Conta
from src.site.classes_de_alunos_e_professores import Aluno


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 = []
        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}; Nota: {self._nota}; 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}; Nota: {self._nota}; 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}; Nota: {self._nota}; Preço: R${self._preco}")


conta_do_alan = Conta("Alan", 123, 130.0)
aluno = Aluno("Alan", conta_do_alan)
aluno.resume_situacao()
curso = CursoProgramacao("Python 3", 9, "Python", "Carlos", 100.0)
print(curso)

Erro:

Traceback (most recent call last):
O/A aluno/a Alan ainda não assinou cursos.
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 105, in <module>
    curso = CursoProgramacao("Python 3", 9, "Python", "Carlos", 100.0)
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 56, in __init__
    super().__init__(nome, aulas, professor, preco)
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 11, in __init__
    self._nota = self.nota_media()
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/classes_de_cursos.py", line 41, in nota_media
    if not self._avaliacoes:
AttributeError: 'CursoProgramacao' object has no attribute '_avaliacoes'

Process finished with exit code 1

Alguém poderia me ajudar?

Grato.

1 resposta
solução!

Olá João, boa noite!

Você está chamando o método self.nota_media() de sua classe Curso na hora de construir o objeto (no método __init__()) - o mesmo vale para CursoProgramacao.

Como o método utiliza o atributo _avaliacoes antes de ser inicializado, não vai reconhecer este atributo ainda.

Chame o método dentro da propriedade de leitura, assim:


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

E inicie sua nota com o valor 0 (zero), assim:

 def __init__(self, nome, aulas, professor, preco, nota=0):
    # código omitido
    self.nota = nota
    # código omitodo

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software