1
resposta

[Resolução]

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!

1 resposta

Parabéns, continue com os estudos!