Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Projeto Final: criando classes, construtores e métodos

Criei com base no que aprendi, tive algumas dificuldades em algumas partes, por exemplo, tentei separar o menu da biblioteca, mas estava dando um erro que não consegui retornar o acesso a biblioteca pelo menu usando import, segue abaixo como ficou:

class main

from biblioteca import Livro

def main():
    Livro.exibir_nome_do_programa()
    Livro.exibir_opcoes()
    Livro.escolher_opcao()

if __name__ == '__main__':
    main()
5 respostas

Class biblioteca parte 01:

import os

class Livro:
    lista_de_livros = [ ]

    def __init__(self, titulo, autor, ano_publicacao):
        self.titulo = titulo.title()
        self.autor = autor.title()
        self.ano_publicacao = ano_publicacao
        self._ativo = True
        Livro.lista_de_livros.append(self)

    def __str__(self):
        return f'- {self.autor.ljust(20)} | {self.titulo.ljust(25)} | {''.ljust(10)}{str(self.ano_publicacao).ljust(10)} | {self.emprestar}.'

    def exibir_nome_do_programa():
        os.system('cls')
        print("""
██████████████████████████████████████████████████████████████████████████████
█▄─▄███▄─▄█▄─█─▄█▄─▄▄▀██▀▄─██▄─▄▄▀█▄─▄██▀▄─█████▀▄─██▄─▄███▄─██─▄█▄─▄▄▀██▀▄─██
██─██▀██─███▄▀▄███─▄─▄██─▀─███─▄─▄██─███─▀─█████─▀─███─██▀██─██─███─▄─▄██─▀─██
▀▄▄▄▄▄▀▄▄▄▀▀▀▄▀▀▀▄▄▀▄▄▀▄▄▀▄▄▀▄▄▀▄▄▀▄▄▄▀▄▄▀▄▄▀▀▀▄▄▀▄▄▀▄▄▄▄▄▀▀▄▄▄▄▀▀▄▄▀▄▄▀▄▄▀▄▄▀
""")

    def exibir_subtitulo(texto):
        os.system('cls')
        linha = '*' * (len(texto) + 8)
        print(linha)
        print(f'\n {texto} \n')
        print(linha)
        print()

#------------Ativ_02 - Print
    def print_livro():
        os.system('cls')
        print(f'\n{''.ljust(10)}{'Autor'.ljust(12)} | {''.ljust(7)}{'Titulo do Livro'.ljust(18)} | {''.ljust(3)}{'Ano de lançamento'.ljust(12)} |{''.ljust(2)}{'Status'}\n')
        print(f'\n{autor1}')
        print(f'{autor2}')
        print(f'{autor3}')
        Livro.voltar_ao_menu_principal()

#------------Ativ_03 - Status do Livro
    @property
    def emprestar(self):
        return '☑ - Emprestado' if self._ativo else '☐ - Disponível'

    def alterar_estado(self):
        self._ativo = not self._ativo
        print(f'O livro {self.titulo} agora esta {self.emprestar}.')
        Livro.voltar_ao_menu_principal()

#------------Ativ_04 - Verificar Disponiblidade
    @staticmethod
    def verificar_disponibilidade():
        print(f'\n{''.ljust(7)}{'Titulo do Livro'.ljust(18)} | {''.ljust(4)}{'Status'}\n') 
        for listar_livros in Livro.lista_de_livros:
            print(f'{listar_livros.titulo.ljust(25)} | {listar_livros.emprestar}')
        Livro.voltar_ao_menu_principal()

#------------Ativ_07 - Por data
    @staticmethod
    def verificar_disponibilidade_ano():
        ano_pesquisado = int(input('Digite o ano que deseja procurar: '))
        for listar_livros in Livro.lista_de_livros:
            if ano_pesquisado == listar_livros.ano_publicacao:
                print(f'{listar_livros.titulo.ljust(25)} | {listar_livros.emprestar}')
            else:
                print('')
        Livro.voltar_ao_menu_principal()    

Class biblioteca parte 02:


#------------Extras
    def voltar_ao_menu_principal():
        input('\nDigite uma tecla para voltar ao menu principal.\n')
        Livro.exibir_nome_do_programa()
        Livro.exibir_opcoes()
        Livro.escolher_opcao()

    def finalizar_app():
        print('Finalizando o app\n')

    def opcao_invalida():
        print('\nOpção Inválida!\n')
        Livro.voltar_ao_menu_principal()

#------------Menu Principal
    def exibir_opcoes():
        print('1. Listar Livros')
        print('2. Verificar Disponibilidade')
        print('3. Atualizar Status')
        print('4. Sair\n')

    def escolher_opcao():
        try:
            opcao_escolhida = int(input('Escolha uma das opções: '))

            if opcao_escolhida == 1:
                Livro.print_livro()
            elif opcao_escolhida == 2:
                Livro.exibir_opcoes_verificar()
                Livro.escolher_opcao_verificar()
            elif opcao_escolhida == 3:
                Livro.exibir_opcoes_status()
                Livro.escolher_opcao_status()
            elif opcao_escolhida == 4:
                Livro.finalizar_app()
            else:
                Livro.opcao_invalida()
        except:
            Livro.opcao_invalida()

#------------Menu Verificar
    def exibir_opcoes_verificar():
        print('1. Verificar por nome')
        print('2. Verificar por data')
        print('3. Voltar ao menu principal\n')

    def escolher_opcao_verificar():
        try:
            opcao_escolhida = int(input('Escolha uma das opções: '))

            if opcao_escolhida == 1:
                Livro.verificar_disponibilidade()
            elif opcao_escolhida == 2:
                Livro.verificar_disponibilidade_ano()
            elif opcao_escolhida == 3:
                Livro.voltar_ao_menu_principal()
            else:
                Livro.opcao_invalida()
        except:
            Livro.opcao_invalida()

#------------Menu Status
    def exibir_opcoes_status():
        print(f'1. Livro: {autor1.titulo}')
        print(f'2. Livro: {autor2.titulo}')
        print(f'3. Livro: {autor3.titulo}')
        print('4. Voltar ao menu principal\n')

    def escolher_opcao_status():
        try:
            opcao_escolhida = int(input('Escolha uma das opções: '))

            if opcao_escolhida == 1:
                autor1.alterar_estado()
            elif opcao_escolhida == 2:
                autor2.alterar_estado()
            elif opcao_escolhida == 3:
                autor3.alterar_estado()
            elif opcao_escolhida == 4:
                Livro.voltar_ao_menu_principal()
            else:
                Livro.opcao_invalida()
        except:
            Livro.opcao_invalida()

#------------Autores
autor1 = Livro('O poder do hábito', 'Charles Duhigg', 2012)
autor2 = Livro('+ Esperto que o diabo', 'Napoleon Hill', 2014)
autor3 = Livro('Em nome do povo', 'Bruno Perini', 2024)
solução!

link GitHub: https://github.com/LuDesigner/atividadePythonAlura06

Obs¹:. eu subi no Git como postado, porém, estou ainda tentando desenvolver no código uma forma do usuário dar as informações e não deixar pronto, caso consiga, estará em commit no git.

Obs²:. Quem poder usar o código e avaliar para me orientar em melhores formas de por em prática fico agradecido.

Boa tarde, Luiz! Como vai?

De um tempo para cá você vem postado bastante aqui no fórum, e isso é gratificante de se ver toda essa interação e comprometimento com os seus estudos, sei que de certa forma motiva os outros alunos.

E sobre melhorias no seu código, não tenho nenhum sugestão, gostei bastante da solução que você chegou.

Bons estudos!

Obrigado Armano