Arq 1 "Livro.py"
class Livro:
"""
Classe que representa um livro.
Cada instância de Livro possui:
- título
- autor
- ano de publicação
- status de disponibilidade
A classe também mantém uma lista com TODOS os livros criados,
simulando um banco de dados em memória.
"""
# Atributo de classe (compartilhado por todas as instâncias)
livros = []
def __init__(self, titulo: str, autor: str, publicacao: int):
"""
Construtor da classe Livro.
Executado automaticamente sempre que um novo livro é criado.
"""
self._titulo = titulo.title()
self._autor = autor.title()
self._publicacao = int(publicacao)
self._disponivel = True # Livro começa disponível
# Registra automaticamente o livro na lista da classe
Livro.livros.append(self)
def __str__(self):
"""
Retorna uma representação textual do livro.
É chamada automaticamente quando usamos print(objeto).
"""
status = "Disponível" if self._disponivel else "Emprestado"
return f"{self._titulo} | {self._autor} | {self._publicacao} | {status}"
def emprestar(self):
"""
Método de instância.
Marca o livro como emprestado, se estiver disponível.
"""
if self._disponivel:
self._disponivel = False
else:
print(f"O livro '{self._titulo}' já está emprestado.")
@property
def disponivel(self):
"""
Propriedade para acessar o status de disponibilidade.
"""
return self._disponivel
# MÉTODO ESTÁTICO
#
# Um método estático pertence à CLASSE, não a uma instância específica.
# Ele não recebe o parâmetro `self` (objeto) nem `cls` (classe).
#
# Características principais:
# - Não acessa atributos de instância diretamente
# - Pode acessar atributos da classe, se referenciados explicitamente
# - Funciona como uma função "organizacional" dentro da classe
#
# Quando usar:
# - Quando a lógica faz sentido conceitualmente dentro da classe
# - Quando a operação NÃO depende de um objeto específico
# - Quando queremos evitar criar instâncias desnecessárias
#
# Exemplo neste projeto:
# O método verificar_disponibilidade analisa TODOS os livros cadastrados
# e retorna aqueles que:
# - estão disponíveis
# - foram publicados em um determinado ano
#
# Apesar de não depender de um livro específico, ele pertence à classe Livro
# porque opera sobre o conjunto de livros da biblioteca.
#
# Uso:
# Livro.verificar_disponibilidade(1949)
@staticmethod
def verificar_disponibilidade(ano: int):
"""
Método estático.
Recebe um ano e retorna uma lista de livros disponíveis
publicados nesse ano.
"""
return [
livro
for livro in Livro.livros
if livro._publicacao == ano and livro._disponivel
]
Arq 2 (biblioteca.py):
from exerc.livro import Livro
"""
Arquivo responsável por simular operações da biblioteca:
- empréstimo
- verificação de disponibilidade
"""
# Criando livros
livro1 = Livro("Dom Quixote", "Miguel de Cervantes", 1605)
livro2 = Livro("1984", "George Orwell", 1949)
livro3 = Livro("Revolução dos Bichos", "George Orwell", 1945)
# Emprestando um livro
livro1.emprestar()
# Verificando se o livro está disponível
print(f"Livro '{livro1._titulo}' disponível? {livro1.disponivel}")
# Usando o método estático
ano = 1949
livros_disponiveis = Livro.verificar_disponibilidade(ano)
print(f"\nLivros disponíveis publicados em {ano}:")
for livro in livros_disponiveis:
print(livro)
Arq 3 (main.py):
from exerc.livro import Livro
"""
Arquivo principal da aplicação.
Responsável por instanciar objetos e exibi-los.
"""
def main():
livro1 = Livro("O Senhor dos Anéis", "J. R. R. Tolkien", 1954)
livro2 = Livro("Harry Potter", "J. K. Rowling", 1997)
print(livro1)
print(livro2)
if __name__ == "__main__":
main()