3° Desafio de Projeto: Modelando o Sistema Bancário em POO com Python
- #Python
Este artigo irá explicar, de maneira simples e passo a passo, como funciona o código feito para o Desafio Modelando o Sistema Bancário em POO com Python. O código foi feito utilizando a linguagem Python e serve como um excelente exemplo de programação orientada a objetos (POO).
Objetivo
O programa permite que um banco gerencie **usuários** e **contas bancárias**. O usuário pode realizar operações como:
- Criar novos usuários.
- Criar novas contas.
- Fazer depósitos e saques.
- Consultar o extrato.
- Listar todas as contas.
Vamos analisar cada parte do código para entender seu funcionamento.
1. Importação de Módulos
import textwrap
O módulo textwrap é utilizado para formatar texto, removendo indentação e deixando as saídas do programa mais bonitas e fáceis de ler.
2. Classe Usuario
A classe Usuario define os dados básicos de um cliente no banco, como nome, CPF, data de nascimento e endereço.
class Usuario:
def __init__(self, nome, data_nascimento, cpf, endereco):
self.nome = nome
self.data_nascimento = data_nascimento
self.cpf = cpf
self.endereco = endereco
O método __init__ é o construtor da classe, responsável por inicializar um novo usuário. Quando um objeto Usuario é criado, esse método define suas informações básicas (nome, CPF, etc.).
Função criar_usuario
def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente número): ")
if Usuario.filtrar_usuario(cpf, usuarios):
print("\n@@@ Já existe usuário com esse CPF! @@@")
return None
Essa função permite a criação de novos usuários. Ela recebe a lista de usuarios como parâmetro e verifica se já existe um usuário com o CPF informado. Caso contrário, coleta as demais informações e adiciona um novo usuário à lista.
Função filtrar_usuario
def filtrar_usuario(cpf, usuarios):
for usuario in usuarios:
if usuario.cpf == cpf:
return usuario
return None
Essa função faz a busca de um usuário baseado no CPF, retornando o objeto correspondente ou None se o CPF não for encontrado.
3. Classe Conta
A classe Conta representa a conta bancária de um usuário, armazenando informações como saldo, número da conta, limite de saque, extrato e o titular da conta (que é um objeto Usuario).
class Conta:
def __init__(self, agencia, numero_conta, usuario):
self.agencia = agencia
self.numero_conta = numero_conta
self.usuario = usuario
self.saldo = 0
self.limite = 500
self.extrato = ""
self.numero_saques = 0
self.LIMITE_SAQUES = 3
Aqui o construtor da classe inicializa a conta com uma agência, número, saldo e define um limite de saques e de saldo.
Função depositar
def depositar(self, valor):
if valor > 0:
self.saldo += valor
self.extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")
Essa função adiciona um valor ao saldo da conta e registra a transação no extrato.
Função sacar
def sacar(self, valor):
if valor > self.saldo:
print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")
elif valor > self.limite:
print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")
elif self.numero_saques >= self.LIMITE_SAQUES:
print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")
elif valor > 0:
self.saldo -= valor
self.extrato += f"Saque:\t\tR$ {valor:.2f}\n"
self.numero_saques += 1
print("\n=== Saque realizado com sucesso! ===")
else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")
Essa função realiza um saque, verificando várias condições, como se o valor do saque é maior que o saldo, se excede o limite ou se o número de saques diários foi ultrapassado.
Função exibir_extrato
def exibir_extrato(self):
print("\n================ EXTRATO ================")
print("Não foram realizadas movimentações." if not self.extrato else self.extrato)
print(f"\nSaldo:\t\tR$ {self.saldo:.2f}")
print("==========================================")
Essa função exibe o extrato da conta, mostrando todas as transações realizadas e o saldo atual.
4. Classe Banco
A classe Banco é a responsável por gerenciar as contas e os usuários.
class Banco:
def __init__(self):
self.usuarios = []
self.contas = []
self.AGENCIA = "0001"
Aqui, o banco possui uma lista de usuários e contas, além de definir uma agência padrão.
Função criar_conta
def criar_conta(self):
cpf = input("Informe o CPF do usuário: ")
usuario = Usuario.filtrar_usuario(cpf, self.usuarios)
if usuario:
numero_conta = len(self.contas) + 1
conta = Conta(self.AGENCIA, numero_conta, usuario)
self.contas.append(conta)
print("\n=== Conta criada com sucesso! ===")
return conta
print("\n@@@ Usuário não encontrado! @@@")
return None
Essa função cria uma nova conta associada a um usuário existente.
Função listar_contas
def listar_contas(self):
for conta in self.contas:
linha = f"""\
Agência:\t{conta.agencia}
C/C:\t\t{conta.numero_conta}
Titular:\t{conta.usuario.nome}
"""
print("=" * 100)
print(textwrap.dedent(linha))
Essa função lista todas as contas cadastradas no banco, exibindo a agência, número da conta e o nome do titular.
5. Função Principal main
def main():
banco = Banco()
while True:
opcao = menu()
if opcao == "d":
numero_conta = int(input("Informe o número da conta: "))
conta = banco.contas[numero_conta - 1]
valor = float(input("Informe o valor do depósito: "))
conta.depositar(valor)
A função main() controla o fluxo principal do programa, exibindo o menu e executando as ações conforme a escolha do usuário.
Conclusão
Este código oferece uma base sólida para entender como funciona a **orientação a objetos** em Python. O conceito de classes, métodos e a interação entre elas é fundamental para projetos maiores e mais complexos.