Fiz a lista conforme o Exercício pediu mas tenho algumas duvidas. Posto o algoritmo completo das 3 classes (livros, biblioteca e main) no final.
Eu criei um método para listar os livros que estão disponíveis mas tenho duas duvidas. O trecho a seguir coloquei, como comentário, a outra maneira que eu resolvi:
@staticmethod
def verificar_disponibilidade(ano):
'''
Fiz de dois jeitos: esse retornando a lista
(que me retorna uma mensagem <__main__.Livro object at blablabal)
E um que monta uma lista em uma string para ser impressa
'''
lista_disponiveis = [livro for livro in Livro.livros if livro._ano_publicado == ano and livro._disponivel is True]
return lista_disponiveis
###O DEBAIXO DEU CERTO TAMBÉM
# lista_disponiveis = []
# #primeiro adiciona os livros disponíveis na lista_disponiveis
# for livro in Livro.livros:
# if livro._ano_publicado == ano and livro._disponivel:
# lista_disponiveis.append(livro)
# #método para listar os livros dentro da lista
# if lista_disponiveis:
# resposta = f'Lista dos livros disponíveis:\n\n'
# for livro in lista_disponiveis:
# resposta += f'{livro._titulo} | {livro._ano_publicado}\n'
# else:
# resposta = f'Não há livros disponíveis'
# return resposta
Quanto as duvidas:
1 - Ao invés de criar uma nova lista, eu gostaria apenas de varrer a lista principal (lista criada logo no começo da classe) que a data batesse. É possível fazer isso? (tentei de vários jeitos e não consegui.
2 - Ao imprimir a lista criada pelo método verificar_disponibilidade(ano), eu vejo as referências aos objetos porém não tenho o retorno dos nomes em String (como deveria ter como planejado no método str. Há algum meio de imprimir a lista mostrando essas instâncias str ou somente gerando uma String em separado listando livro por livro?
Algoritmo completo:
livro.py
class Livro:
livros = []
def __init__(self, titulo, autor, ano_publicado):
self._titulo = titulo
self._autor = autor
self._ano_publicado = ano_publicado
self._disponivel = True
Livro.livros.append(self)
def __str__(self):
return f'{self._titulo.ljust(20)} | {self._autor.ljust(20)} | {str(self._ano_publicado).ljust(20)}'
def emprestar(self):
self._disponivel = False
@staticmethod
def verificar_disponibilidade(ano):
'''
Fiz de dois jeitos: esse retornando a lista
(que me retorna uma mensagem <__main__.Livro object at blablabal)
E um que monta uma lista em uma string para ser impressa
'''
lista_disponiveis = [livro for livro in Livro.livros if livro._ano_publicado == ano and livro._disponivel is True]
return lista_disponiveis
###O DEBAIXO DEU CERTO TAMBÉM
# lista_disponiveis = []
# #primeiro adiciona os livros disponíveis na lista_disponiveis
# for livro in Livro.livros:
# if livro._ano_publicado == ano and livro._disponivel:
# lista_disponiveis.append(livro)
# #método para listar os livros dentro da lista
# if lista_disponiveis:
# resposta = f'Lista dos livros disponíveis:\n\n'
# for livro in lista_disponiveis:
# resposta += f'{livro._titulo} | {livro._ano_publicado}\n'
# else:
# resposta = f'Não há livros disponíveis'
# return resposta
biblioteca.py
from livro import Livro
livro1 = Livro('Memórias Postumas de Brás Cubas', 'Machado de Assis', 1881)
livro2 = Livro('Ousadia e Alegria', 'Thiaguinho', 2023)
livro3 = Livro('O Mulato', 'Aluisio de Azevedo', 1881)
livro4 = Livro('The Prince and the Pauper', 'Mark Twain', 1881)
# livro1.emprestar()
# status_teste = Livro.verificar_disponibilidade(1881)
# print(status_teste)
# print(Livro.verificar_disponibilidade(1881)[0])
main.py
from livro import Livro
import biblioteca
def main():
for livro in Livro.livros:
print(livro)
if __name__ == '__main__':
main()
Muito obrigado pela atenção e estou aberto a sugestões de melhorias e boas práticas!