1
resposta

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

#Arquivo: OO_livro_1_de_3.py

#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:

lista_de_livros = []

def __init__(self, titulo: str, autor: str, ano_publicacao: int, disponivel = True):
    self._titulo = titulo.title()
    self._autor = autor.title()
    self._ano_publicacao = ano_publicacao
    self._disponivel = disponivel
    Livro.lista_de_livros.append(self)

#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'{self._titulo:<22} | {self._autor:<22} | {self._ano_publicacao:<18} | {self._disponivel}'

@classmethod
def listar_livros(cls):
    print(f'{"Livro":<22} | {"Autor":<22} | {"Ano de publicação":<18} | Disponível')
    count=1
    for livro in cls.lista_de_livros:
        print(f'{livro}')
        count += 1
    print()

#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

#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):
ano = ano
for livro in Livro.lista_de_livros:
if livro._ano_publicacao == ano:
print(f'{livro}')
print()

#5, 6 e 7 no arquivo:
#OO_biblioteca.py

#8 no arquivo:
#OO_main.py

#Arquivo: OO_biblioteca_2_de_3.py

#5.Crie um arquivo chamado biblioteca.py e importe a classe Livro neste arquivo.
#OO-biblioteca.py

from OO_livro_1_de_3 import Livro

livro1 = Livro('Os Luziadas', 'Camões', 1572)
livro2 = Livro('Você não sabe estudar', 'José Mario Chaves', 2024)
livro3 = Livro('O Senhor dos Anéis', 'J. R. R. Tolkien', 1954)

#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.
livro1.emprestar()

Livro.listar_livros()

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

Livro.verificar_disponibilidade(2024)

#Arquivo: OO_main_3_de_3.py

#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 OO_livro_1_de_3 import Livro

livro4 = Livro('Harry Potter', 'J. K. Rowling', 1997)
livro5 = Livro('O Hobbit', 'J. R. R. Tolkien', 1937)

Livro.listar_livros()

1 resposta

Oi, Marcos! Como vai?

Seu projeto está bem estruturado e demonstra um bom domínio da orientação a objetos em Python. A forma como você utilizou atributos privados e o método de classe listar_livros está clara e funcional.

Uma dica interessante para o futuro é usar o método especial __str__ corretamente para que ele funcione ao imprimir a instância do objeto. No seu código, está como def str(self):, mas o correto seria def __str__(self):. Veja como ajustar:


def __str__(self):
    return f'{self._titulo:<22} | {self._autor:<22} | {self._ano_publicacao:<18} | {self._disponivel}'

Explicando: com __str__, ao dar print(livro1), você verá a string formatada automaticamente, sem precisar chamar um método manualmente.