1
resposta

[Projeto] Resolução dos Exercícios

Gostaria apenas de publicar minha resolução desses exercícios propostos. Fui utilizando a convenção de botar o underscore antes dos atributos para indicar que eles são privadosm e fui me acostumando a usar as @property para visualizar e alterar o valor deles. Acho que compliquei mais do que o necessário, mas o resultado parece certo.

Criei dois arquivos, o livro.py que ficou apenas toda a definição da classe, e o arquivo biblioteca.py que ficou todos os instanceamentos dos objetos e os testes dos métodos que foram propostos nos exercícios.

O arquivo livro.py ficou assim:

class Livro:
    livros = []
    
    def __init__(self, titulo: str, autor: str, ano_publicacao: int):
        self._titulo = titulo
        self._autor = autor
        self._ano_publicacao = ano_publicacao
        self._disponivel = True
        Livro.livros.append(self)

    @property
    def titulo(self) -> str:
        return self._titulo

    @property
    def autor(self) -> str:
        return self._autor

    @property
    def ano_publicacao(self) -> int:
        return self._ano_publicacao

    @property
    def disponivel(self) -> bool:
        return self._disponivel

    @disponivel.setter
    def disponivel(self, valor):
        if isinstance(valor, bool):
            self._disponivel = valor
        else:
            raise ValueError("Disponibilidade deve ser um valor booleano")

    def __str__(self):
        status = 'Sim' if self.disponivel else 'Não'
        return f'Título: {self.titulo.ljust(25)} | Autor: {self.autor.ljust(25)} | Ano de Publicação: {str(self.ano_publicacao).ljust(25)} | Diponível: {status}'

    def emprestar(self):
        self.disponivel = False

    @classmethod
    def verificar_disponibilidade(cls, ano: int):
        livros_disponiveis = []
        for livro in cls.livros:
            if livro.ano_publicacao == ano and livro.disponivel == True:
                livros_disponiveis.append(livro)
        return livros_disponiveis

E o arquivo biblioteca.py ficou assim:

from livro import Livro
import os

def main():
    livro1 = Livro('Morro dos Ventos Uivantes', 'Emily Brontë', 1847)
    livro2 = Livro('Macunaíma', 'Mário de Andrade', 1928)
    livro3 = Livro("O Senhor dos Anéis", "J.R.R. Tolkien", 1954)
    livro4 = Livro("O Hobbit", "J.R.R. Tolkien", 1937)
    livro5 = Livro("A Revolução dos Bichos", "George Orwell", 1945)
    livro6 = Livro("1984", "George Orwell", 1949)

    print(f'{'-' * 30} Exercício 2 {'-' * 30}')
    print(livro1)
    print(livro2)
    print()

    print(f'{'-' * 30} Exercício 3 {'-' * 30}')
    livro1.emprestar()
    print(livro1)
    print()

    print(f'{'-' * 30} Exercício 4 {'-' * 30}')
    livros_encontrados = Livro.verificar_disponibilidade(1954)
    if livros_encontrados:
        print('Livros encontrados:')
        for livro in livros_encontrados:
            print(livro)
    else:
        print('Nenhum livro encontrado para este ano.')
    print()

if __name__ == '__main__':
    os.system('cls')
    main()

E a saída no terminal foi essa:
Imagem contendo apenas toda a saída que o código gerou no terminal

1 resposta

Bom dia! Tudo bem?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de encapsulamento com propriedades para proteger os atributos da classe, utilizou muito bem o método __str__ para apresentar os dados de forma organizada e ainda compreendeu a importância do uso de métodos de classe para realizar buscas específicas entre instâncias.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!