1
resposta

[Projeto] Resolução da Atividade, Guiada e com Observações

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()
1 resposta

Olá, Lucas! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de atributos de classe para simular um banco de dados em memória, utilizou muito bem o método __str__ para gerar uma representação textual clara dos objetos e ainda compreendeu a importância dos métodos estáticos para operações que fazem sentido no contexto da classe sem depender de uma instância específica.

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

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

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!