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

Erro de atributo

Conforme avanço nos cursos de Python, vou escrevendo meus próprios códigos para consolidar o aprendizado. Tentei desenvolver um sistema de exibição de "cursos online", mas ocorreram vários problemas ao tentar implementar o avaliador. Creio ter resolvido a maior parte deles, mas ainda resta um. É um erro de atributo.

O código é dividido em duas partes: Um arquivo contém todas as classes e o outro serve para criarmos os nossos "cursos" a serem exibidos.

Código das classes:

import sys


class Curso:

    def __init__(self, nome, aulas, nota):
        self._nome = nome
        self._aulas = aulas
        self._nota = nota

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

    @nome.setter
    def muda_nome(self, novo_nome):
        self._nome = novo_nome.title()

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

    @aulas.setter
    def altera_aulas(self, novo_numero):
        self._aulas = novo_numero

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

    @staticmethod
    def tipos_de_curso():
        return "Programação, Design, Mobile"


class Grupo:
    def __init__(self, nome):
        self.nome = nome
        self._cursos = []

    @property
    def cursos(self):
        return self._cursos


class Programacao(Curso):
    def __init__(self, nome, aulas, linguagem, nota):
        super().__init__(nome, aulas, nota)
        self._nome = nome
        self._aulas = aulas
        self.linguagem = linguagem
        self._nota = nota


class Design(Curso):
    def __init__(self, nome, aulas, ferramenta, nota):
        super().__init__(nome, aulas, nota)
        self._nome = nome
        self._aulas = aulas
        self.ferramenta = ferramenta
        self._nota = nota


class Mobile(Curso):
    def __init__(self, nome, aulas, so, nota):
        super().__init__(nome, aulas, nota)
        self._nome = nome
        self._aulas = aulas
        self.so = so
        self._nota = nota


class CursoProg:
    def __str__(self):
        return (f"Nome do curso: {self._nome}; Nº de aulas: {self._aulas}; Tipo: Programação; "
                f"Linguagem: {self.linguagem}" f"; Nota: {self._nota}")


class CursoDes:
    def __str__(self):
        return (f"Nome do curso: {self._nome}; Nº de aulas: {self._aulas}; Tipo: Design; Ferramenta: {self.ferramenta};"
                f" Nota: {self._nota}")


class CursoMob:
    def __str__(self):
        return (f"Nome do curso: {self._nome}; Nº de aulas: {self._aulas}; Tipo: Mobile; So = {self.so}; "
                f"Nota: {self._nota}")


class CursoProgramacao(Programacao, CursoProg):
    pass


class CursoDesign(Design, CursoDes):
    pass


class CursoMobile(Mobile, CursoMob):
    pass


class Avaliador:
    def __init__(self):
        self.maior_nota = sys.float_info.min
        self.menor_nota = sys.float_info.max

    def avalia(self, lista: Grupo):

        for curso in lista.cursos:
            if curso.nota > self.maior_nota:
                self.maior_nota = curso.nota
            if curso.nota < self.menor_nota:
                self.menor_nota = curso.nota

Código criador de cursos:

from src.site.cursos import Grupo, Avaliador, CursoProgramacao, CursoDesign, CursoMobile

#site é o pacote python onde estão localizados os dois arquivos

python = CursoProgramacao("Avançando com Python", 10, "Python", 10.0)
photoshop_1 = CursoDesign("Refinando nosso projeto", 6, "Photoshop", 9.2)
android = CursoMobile("Criando nossa primeira aplicação", 8, "Android", 9.5)

lista_de_cursos = [python, photoshop_1, android]

cursos = Grupo("Cursos")

cursos.cursos.append(lista_de_cursos)

for curso in lista_de_cursos:
    print(curso)

avaliador_cursos = Avaliador()

avaliador_cursos.avalia(cursos)

print(f"O curso melhor avaliado é {avaliador_cursos.maior_nota}")
print(f"O curso pior avaliado é {avaliador_cursos.menor_nota}")

Quando rodo, aparece a seguinte mensagem de erro:

Traceback (most recent call last):
Nome do curso: Avançando com Python; Nº de aulas: 10; Tipo: Programação; Linguagem: Python; Nota: 10.0
  File "C:/Users/Windows 10/PycharmProjects/desenvolvimento_cursos/src/site/cria_cursos.py", line 20, in <module>
Nome do curso: Refinando nosso projeto; Nº de aulas: 6; Tipo: Design; Ferramenta: Photoshop; Nota: 9.2
    avaliador_cursos.avalia(cursos)
Nome do curso: Criando nossa primeira aplicação; Nº de aulas: 8; Tipo: Mobile; So = Android; Nota: 9.5
  File "C:\Users\Windows 10\PycharmProjects\desenvolvimento_cursos\src\site\cursos.py", line 99, in avalia
    if curso._nota > self.maior_nota:
AttributeError: 'list' object has no attribute '_nota'

Estou tentando resolver esse erro e não consigo encontrar a lógica. Alguém pode me ajudar, por favor?

Também aceito qualquer crítica construtiva em relação à estruturação do código.

Grato.

1 resposta
solução!

Resolvido.

No código cria_cursos, em vez de adicionar a lista_de_cursos ao cursos.cursos, adicionei um por um os elementos.

from src.site.cursos import Grupo, Avaliador, CursoProgramacao, CursoDesign, CursoMobile

# site é o pacote python onde estão localizados os dois arquivos

python = CursoProgramacao("Avançando com Python", 10, "Python", 10.0)
photoshop_1 = CursoDesign("Refinando nosso projeto", 6, "Photoshop", 9.2)
android = CursoMobile("Criando nossa primeira aplicação", 8, "Android", 9.5)

cursos = Grupo("Cursos")

cursos.cursos.append(python)
cursos.cursos.append(photoshop_1)
cursos.cursos.append(android)

for curso in cursos.cursos:
    print(curso)

avaliador_cursos = Avaliador()

avaliador_cursos.avalia(cursos)

print(f"A maior nota é {avaliador_cursos.maior_nota}")
print(f"A menor nota é {avaliador_cursos.menor_nota}")