Oii Luigge, como você está? Espero que esteja bem ^-^
Quando falamos sobre yield, essa palavrinha chave está atrelada ao conceito de geradores/generators, que são funções que retornam um valor de cada vez e isso geralmente é utilizado quando possuímos pouca memória e gerar todos os valores de uma só vez, pode comprometê-la. Veja um exemplo prático de um gerador. Como base, pegaremos a seguinte função:
def exemplo_de_gerador():
print("Primeira Frase")
print("Segunda Frase")
print("Terceira Frase")
print("Quarta Frase")
Se execurtamos a função, teremos o seguinte resultado:
Primeira Frase
Segunda Frase
Terceira Frase
Quarta Frase
Até esse ponto nada de novo, certo? Agora, se colocarmos a palavrinha mágica yield no código, veja o que acontece:
def exemplo_de_gerador():
print("Primeira Frase")
yield
print("Segunda Frase")
yield
print("Terceira Frase")
yield
print("Quarta Frase")
Quando executarmos a função do modo convencional:exemplo_de_gerador()
, será nos mostrado algo como:
<generator object exemplo_de_gerador at 0x7f8f857a0750>
Mas o que isso significa? Significa que a partir do momento que colocamos o yield no código, a função se tornou um gerador, ou seja, ela irá retornar um valor de cada vez e para pegarmos esse valor de retorno, devemos utilizar a palavrinha chave next. Veja:
funcao = exemplo_de_gerador()
next(funcao)
O resultado será apenas "Primeira Frase", pois por ser um gerador, irá retornar um valor de cada vez. Se executarmos novamente o next, ele nos devolverá o próximo valor e assim por diante, até que não tenha mais valores a serem retornados e o programa retorne Stop Interation:
funcao = exemplo_de_gerador()
next(funcao)
next(funcao)
## Resultado
Primeira Frase
Segunda Frase
Dito isso e voltando ao seu código, ele não está funcionando porque por padrão o método __repr__
retornar um tipo str e no seu caso, ao utilizar o yield, você está gerando um tipo de valor, o que faz a função ser do tipo gerador e não str.
Sendo assim, para corrigir o código atual, é necessário retornar uma string. Veja como fica:
def __repr__(self):
return ("HOJE {} É SUAS AULAS DE HOJE SÃO".format(self.dia) + "\n"
"1°- Àa {} HRS - {}".format(self.h1, self.aula1) + "\n"
"2°- Àa {} HRS - {}".format(self.h2, self.aula2) + "\n"
"3°- Àa {} HRS - {}".format(self.h3, self.aula3) + "\n"
"4°- Àa {} HRS - {}".format(self.h4, self.aula4) + "\n"
"5°- Àa {} HRS - {}".format(self.h5, self.aula5) + "\n"
"6°- Àa {} HRS - {}".format(self.h6, self.aula6) + "\n"
"7°- Àa {} HRS - {}".format(self.h7, self.aula7) + "\n"
"-------------------")
Outro ponto de atenção em seu código, é o modo como você utiliza a herança de classes. Nela, você chama o método __init__
da classe mãe "Aulas", e como todos os atributos são os mesmos, não há a necessidade de atribuir os valores após a invoção do método da classe mãe. Veja como fica:
class Segunda(Aulas):
def __init__(self, dia, aula1, aula2, aula3, aula4, aula5, aula6, aula7, h1, h2, h3, h4, h5, h6, h7):
super().__init__(dia, aula1, aula2, aula3, aula4, aula5, aula6, aula7, h1, h2, h3, h4, h5, h6, h7)
Vale ressaltar também, sobre o padrão de nomenclatura das variáveis. Segundo a PEP 8, o guia de estilos de código Python, os nomes das classes devem estar no padrão PascalCase, onde a primeira letra de cada palavra é maiúscula. Em seu código em algumas classes há esse padrão, já em outras não. É interessante padronizar.
O código completo com as mudanças citadas, pode ser acessado neste gist do github
Como complemento, deixo abaixo um artigo do blog da Alura que trata sobre o assunto de geradores:
Qualquer dúvida estou por aqui, a gente vai conversando.
Grande abraço e bons estudos!