1
resposta

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

  1. Crie uma classe chamada Livro com um construtor que aceita os parâmetros titulo, autor e ano_publicacao. Inicie um atributo chamado disponivel como True por padrão.
class Livro:
    def __init__(self, titulo, autor, ano_lancamento):
        self.titulo = titulo
        self.autor = autor
        self.ano_lancamento = ano_lancamento
        self.disponivel = True
  1. Na classe Livro, adicione um método especial str que retorna uma mensagem formatada com o título, autor e ano de publicação do livro. Crie duas instâncias da classe Livro e imprima essas instâncias.
    def __str__(self):
        return f"Título: {self.titulo} | Autor: {self.autor} | Ano de lançamento: {self.ano_lancamento}"
livro1 = Livro("Senhor dos Anéis - A Sociedade do Anel", "J.R.R Tolkien", 1954)
livro2 = Livro("Duna", "Frank Herbert", 1965)
print(livro1)
print(livro2)
  1. Adicione um método de instância chamado emprestar à classe Livro que define o atributo disponivel como False. Crie uma instância da classe, chame o método emprestar e imprima se o livro está disponível ou não.
   def emprestar_livro(self):
        self.disponivel = False
livro3 = Livro("Guia do Mochileiro das Galáxias", "Douglas Adams", 1979)
livro3.emprestar_livro()
print(livro3.disponivel)
  1. Adicione um método estático chamado verificar_disponibilidade à classe Livro que recebe um ano como parâmetro e retorna uma lista dos livros disponíveis publicados nesse ano.
    @staticmethod
    def verificar_disponibilidade(ano):
        livros_disponiveis = [livro for livro in Livro.livros if livro.ano_lancamento == ano and livro.disponivel]
        return livros_disponiveis
livros1954 = Livro.verificar_disponibilidade(1954)
for livro in livros1954:
    print(livro)
  1. Crie um arquivo chamado biblioteca.py e importe a classe Livro neste arquivo.

arquivo biblioteca.py

from exercicios3 import Livro
  1. No arquivo biblioteca.py, empreste o livro chamando o método emprestar e imprima se o livro está disponível ou não após o empréstimo.
livro5 = Livro("O Senhor dos Anéis - As Duas Torres", "J.R.R Tolkien", 1954)
print(livro5)
livro5.emprestar_livro()
print(livro5.disponivel)
  1. No arquivo biblioteca.py, utilize o método estático verificar_disponibilidade para obter a lista de livros disponíveis publicados em um ano específico.
livros1954 = Livro.verificar_disponibilidade(1954)
for livro in livros1954:
    print(livro)
  1. Crie um arquivo chamado main.py, importe a classe Livro e, no arquivo main.py, instancie dois objetos da classe Livro e exiba a mensagem formatada utilizando o método str.

arquivo main.py

from exercicios3 import Livro

Livro1 = Livro("Senhor dos Anéis - A Sociedade do Anel", "J.R.R Tolkien", 1954)
Livro2 = Livro("Duna", "Frank Herbert", 1965)
print(Livro1)
print(Livro2)
1 resposta

Olá, Luiz Fernando! Como vai?

Parabéns pela dedicação em resolver todos os passos do exercício! Você demonstrou uma compreensão sólida dos pilares da Orientação a Objetos no Python, especialmente no uso de construtores, métodos de instância e métodos especiais como o __str__.

Gostaria de destacar alguns pontos muito positivos na sua resolução:

  • **Método Especial __str__**: Você o utilizou corretamente para fornecer uma representação legível dos seus objetos. No Python, isso é essencial para facilitar o debug e a exibição de informações sem precisar acessar atributo por atributo.
  • Encapsulamento de Comportamento: O método emprestar_livro é um ótimo exemplo de como alterar o estado interno de um objeto (self.disponivel) através de uma ação definida, o que mantém a lógica organizada.
  • Modularização: A criação dos arquivos biblioteca.py e main.py com a importação da classe mostra que você já está pensando na organização de projetos maiores, separando a definição da classe da execução do programa.

Um detalhe importante sobre o Método Estático

Notei um ponto de atenção no seu método verificar_disponibilidade. Você tentou iterar sobre Livro.livros:

livros_disponiveis = [livro for livro in Livro.livros if ...]

Para que isso funcione, a classe Livro precisaria ter um atributo de classe (uma lista) que armazena todas as instâncias criadas. Caso contrário, o Python retornará um erro dizendo que Livro não possui o atributo livros.

Uma forma comum de resolver isso é adicionar a lista na definição da classe e alimentá-la no __init__:

class Livro:
    livros = []  # Atributo de classe para armazenar todas as instâncias

    def __init__(self, titulo, autor, ano_lancamento):
        self.titulo = titulo
        self.autor = autor
        self.ano_lancamento = ano_lancamento
        self.disponivel = True
        Livro.livros.append(self)  # Adiciona o livro recém-criado à lista

Dica de Estilo (PEP 8)

No seu arquivo main.py, você instanciou Livro1 e Livro2 com a primeira letra maiúscula. No Python, por convenção (PEP 8), usamos PascalCase para nomes de classes (Livro) e snake_case para nomes de variáveis e instâncias (livro_1, livro_2). Isso ajuda outros programadores a baterem o olho no código e saberem o que é uma classe e o que é um objeto.

Seu progresso na aplicação de Orientação a Objetos está excelente! Continue praticando essa estrutura de pensamento, pois ela é a base para frameworks poderosos como Django e Flask.

Espero que possa ter lhe ajudado!