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.