0
respostas

Hora da prática: criando classes, construtores e métodos

livro.py

from __future__ import annotations
from typing import ClassVar
class Livro:
    livros: ClassVar[list["Livro"]] = [] 

    def __init__ (self, titulo: str, autor: str, ano_publicado: int) -> None:
        self._titulo: str = titulo
        self._autor: str = autor
        self._ano_publicado: int = ano_publicado
        self._disponivel: bool = True

        Livro.livros.append(self)
        
    def __str__(self) -> str:
        return(
            f"{self._titulo.ljust(25)} |"
            f"{self._autor.ljust(25)} |"
            f"{str(self._ano_publicado).ljust(25)}"
        )
    
    @classmethod
    def lista_de_livros(cls) -> str:
        cls.livros.sort(key=lambda livro: (livro.ano, livro.titulo))
        
        cabecalho = (
            f"{'Titulo'.ljust(25)} |"
            f"{'Autor'.ljust(25)} |"
            f"{'Ano publicado'.ljust(25)}"
        )

        linhas = ["-" * len(cabecalho), cabecalho, "-" * len(cabecalho)]
        
        linhas.extend(str(livro) for livro in cls.livros)
        return "\n".join(linhas)
    
    @property 
    def titulo(self) -> str:
        return self._titulo
    
    @property
    def autor(self) -> str:
        return self._autor
    
    @property
    def ano(self) -> int:
        return self._ano_publicado
    
    @property
    def status(self) -> str:
        return (f"\nO livro {self.titulo} está Disponivel" if self._disponivel else f"O livro {self.titulo} está Indisponivel")
    
    def emprestar(self) -> None:
        if not self._disponivel:
            print("\nLivro indisponivel no momento")
            return
        print(f"\nLivro {self.titulo} foi emprestado com sucesso!")
        self._disponivel = False

    def devolver(self) -> None:
        if self._disponivel:
            print("\nLivro ja foi devolvido")
            return
        print(f"\nLivro {self.titulo} foi devolvido com sucesso!")
        self._disponivel = True

    @staticmethod
    def verificar_disponibilidade_ano(ano: int) -> list["Livro"]:
        livros_disponiveis = []

        for livro in Livro.livros:
            if livro.ano == ano and livro._disponivel:
                livros_disponiveis.append(livro)
        
        return livros_disponiveis
    
    @classmethod
    def disponibilidade_ano(cls, ano: int) -> None:

        livros = cls.verificar_disponibilidade_ano(ano)
        if livros:
            print(f"\nOs livros disponíveis de {ano} são: ")
            for livro in livros:
                print(f" - {livro.titulo} - {livro.autor}")
        else:
            print(f"\nNão há livros disponíveis de {ano}")

biblioteca.py

from modelos.livro import Livro 

livro1 = Livro("Dom Casmurro", "Machado de Assis", 1899)
livro2 = Livro("Coraline", "Neil Gaiman", 2002)
livro3 = Livro("A Vida de Pi", "Yann Martel", 2002)
livro4 = Livro("O Livro das Ilusões", "Paul Auster", 2002)
livro5 = Livro("Ressurreição", "Leo Tolstoy", 1899)

print(Livro.lista_de_livros())

livro1.emprestar()
print(livro1.status)

Livro.disponibilidade_ano(2000)
Livro.disponibilidade_ano(1899)

main.py

from modelos.livro import Livro

livro6 = Livro("Contos da Carochinha", "Alberto Figueiredo", 1896)
livro7 = Livro("Rã e Sapo são amigos", "Arnold Lobel", 1970)

print(livro6)
print(livro7)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade