Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] 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_puplicado):
        self.titulo = titulo
        self.autor = autor
        self.ano_puplicado = ano_puplicado
        self.disponivel = True

2) 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'Livro {self.titulo} do autor {self.autor} que foi puplicado no ano {self.ano_puplicado}'
    
livro1 = Livro("Aprendendo Python", "John Doe", 2022)
livro2 = Livro("Data Science Fundamentals", "Jane Smith", 2020)

print(livro1)
print(livro2)

3) 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(self):
    self.disponivel = False

livro3 = Livro('Python Cookbook', 'Samuel Developer', 2019)
print(f'Antes de emprestar: Livro disponivel? {livro3.disponivel}')
livro3.emprestar()
print(f'Depois de emprestar: Livro disponivel? {livro3.disponivel}')

4) 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_disponivel = [livro for livro in Livro.livros if livro.ano_puplicado == ano and livro.disponivel]
    return livros_disponivel

Livro.livros = [livro1, livro2, livro3]

5) Crie um arquivo chamado biblioteca.py e importe a classe Livro neste arquivo.

from ex08 import Livro

6) 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.

livro_biblioteca = Livro("Python in Practice", "Emily Coder", 2021)
print(f"Antes de emprestar (biblioteca): Livro disponível? {livro_biblioteca.disponivel}")
livro_biblioteca.emprestar()
print(f"Depois de emprestar (biblioteca): Livro disponível? {livro_biblioteca.disponivel}")

7) 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.

ano_especifico = 2020
livro_biblioteca_ano = Livro.verificar_disponibilidade(ano_especifico)
print(f'Livro disponivel em {ano_especifico}: {livro_biblioteca_ano}')

8) 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.

from ex08 import Livro

livro_main1 = Livro('Python para iniciantes', 'Carlos Coder', 2021)
livro_main2 = Livro('Web development Essentials', 'Laura Developer', 2023)

print(livro_main1)
print(livro_main2)
1 resposta

Olá, Apollo! Tudo bem?

Que ótimo ver você praticando a criação de classe, construtores e métodos em Python!

Você implementou todas as etapas propostas com bastante capricho, incluindo a separação em arquivos distintos, o uso correto do self em cada método e a aplicação do método estático com o decorador @staticmethod. Isso mostra que você está assimilando bem os conceitos fundamentais da orientação a objetos.

Um detalhe importante que vale a pena corrigir está no nome do atributo ano_puplicado. O nome correto seria ano_publicado, com o "b" antes do "l". Manter uma nomenclatura consistente em toda a classe é essencial para evitar erros ao acessar atributos e para deixar o código mais legível e organizado. Esse tipo de cuidado faz bastante diferença em projetos maiores, como um sistema de biblioteca, por exemplo.

Uma dica interessante para o futuro é utilizar a função getattr(), que permite acessar um atributo de forma segura. Veja este exemplo:


nome = getattr(livro, "titulo", "Sem titulo")
print(nome)

Nesse exemplo, getattr() tenta obter o atributo titulo do objeto livro. Caso ele não exista, o valor padrão "Sem titulo" será retornado no lugar de gerar um erro. Isso é muito útil quando você não tem certeza se o atributo foi definido corretamente.

Agora que você já praticou o método emprestar para alterar o atributo disponivel, que tal pensar em como implementaria um método devolver para reverter essa operação e deixar o livro disponível novamente?

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