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

[Projeto] Tentativa de resolução

class ContaBancaria:
    
    def __init__(self, titular, saldo):
        self._titular = titular.title()
        self.saldo = saldo
        self._ativo = False

    def __str__(self):
        return f'Titular da conta: {self._titular} | Saldo da conta: {self.saldo}'

    @classmethod
    def ativar_conta(cls, conta):
        conta._ativo = True
    
    @property
    def ativo(self):
        return '✅' if self._ativo else '❎'

class ClienteBanco:
    
    def __init__(self, nome, idade, profissão, endereco, estadocivil):
        self._nome = nome.title()
        self.idade = idade
        self.profissão = profissão
        self.endereco = endereco
        self.estadocivil = estadocivil
    
    def __str__(self):
        return f'{self._nome.ljust(10)} | {self.idade.ljust(10)} | {self.profissão}'
    
    @classmethod
    def criar_conta(cls, titular, saldo_inicial):
        conta = ContaBancaria(titular, saldo_inicial)
        return conta

cliente1 = ClienteBanco('Martina', '20', 'Desempregada', 'Rua das Flores, 241', 'Solteira')
cliente2 = ClienteBanco('Gabriel', '19', 'Veterinário', 'Rua Senador Pinheiro Machado, 519', 'Solteiro')
cliente3 = ClienteBanco('Otávio', '33', 'Advogado', 'Rua Marechal Floriano, 705', 'Casado')

conta_cliente1 = ClienteBanco.criar_conta('Martina', 500)
print(f'Conta de {conta_cliente1._titular} criada com saldo inicial de R$ {conta_cliente1.saldo}\n')

conta_cliente2 = ClienteBanco.criar_conta('Gabriel', 10000)
print(f'Conta de {conta_cliente2._titular} criada com saldo inicial de R$ {conta_cliente2.saldo}\n')

conta_cliente3 = ClienteBanco.criar_conta('Otávio', 43670)
print(f'Conta de {conta_cliente3._titular} criada com saldo inicial de R$ {conta_cliente3.saldo}\n')

conta1 = ContaBancaria('Rafael', 2000)
conta2 = ContaBancaria('Henrique', 300)
conta3 = ContaBancaria('Isabelli', 50)

print(conta1)
print(conta2)
print(f'{conta3}\n')
print(f'Conta de {conta3._titular} ativa? {conta3.ativo}\n')
ContaBancaria.ativar_conta(conta3)
print(f'Conta de {conta3._titular} ativa? {conta3.ativo}\n')```
2 respostas

A partir do desafio 4 tive algumas dificuldades de fazer o que foi pedido. Por isso não tenho certeza se o que eu fiz está correto.

solução!

Oi, dev! Tudo bem?

Seu código está bem estruturado, parabéns pela sua elaboração, ficou realmente muito bom! Deixo algumas observações e sugestões para melhorar ainda mais sua solução:

Em relação a classe ContaBancaria o construtor (__init__) está correto, inicializando titular, saldo e _ativo, o método especial __str__ está bem implementado, retornando uma string formatada, o método de classe ativar_conta está correto, alterando o atributo _ativo, a propriedade ativo está bem implementada, retornando um símbolo baseado no estado de _ativo.

Em relação a classe ClienteBanco, o construtor (__init__) está correto, aceitando os cinco atributos e o método de classe criar_conta está correto, criando e retornando uma instância de ContaBancaria.

Como sugestões de melhorias deixo:

  1. Tipos de Dados: É uma boa prática tipar os parâmetros e os retornos dos métodos para maior clareza e segurança.
  2. Encapsulamento: Considere usar propriedades para acessar os atributos privados _nome, _titular, etc.

Podemos, então, refatorar nosso código da seguinte forma:

class ContaBancaria:
    
    def __init__(self, titular: str, saldo: float):
        self._titular = titular.title()
        self.saldo = saldo
        self._ativo = False

    def __str__(self) -> str:
        return f'Titular da conta: {self._titular} | Saldo da conta: R$ {self.saldo:.2f}'

    @classmethod
    def ativar_conta(cls, conta: 'ContaBancaria'):
        conta._ativo = True
    
    @property
    def ativo(self) -> str:
        return '✅' if self._ativo else '❎'

    @property
    def titular(self) -> str:
        return self._titular

class ClienteBanco:
    
    def __init__(self, nome: str, idade: int, profissao: str, endereco: str, estado_civil: str):
        self._nome = nome.title()
        self.idade = idade
        self.profissao = profissao
        self.endereco = endereco
        self.estado_civil = estado_civil
    
    def __str__(self) -> str:
        return f'{self._nome.ljust(10)} | {str(self.idade).ljust(10)} | {self.profissao}'
    
    @classmethod
    def criar_conta(cls, titular: str, saldo_inicial: float) -> ContaBancaria:
        conta = ContaBancaria(titular, saldo_inicial)
        return conta

# Instanciando clientes
cliente1 = ClienteBanco('Martina', 20, 'Desempregada', 'Rua das Flores, 241', 'Solteira')
cliente2 = ClienteBanco('Gabriel', 19, 'Veterinário', 'Rua Senador Pinheiro Machado, 519', 'Solteiro')
cliente3 = ClienteBanco('Otávio', 33, 'Advogado', 'Rua Marechal Floriano, 705', 'Casado')

# Criando contas para os clientes
conta_cliente1 = ClienteBanco.criar_conta('Martina', 500)
print(f'Conta de {conta_cliente1.titular} criada com saldo inicial de R$ {conta_cliente1.saldo:.2f}\n')

conta_cliente2 = ClienteBanco.criar_conta('Gabriel', 10000)
print(f'Conta de {conta_cliente2.titular} criada com saldo inicial de R$ {conta_cliente2.saldo:.2f}\n')

conta_cliente3 = ClienteBanco.criar_conta('Otávio', 43670)
print(f'Conta de {conta_cliente3.titular} criada com saldo inicial de R$ {conta_cliente3.saldo:.2f}\n')

# Criando contas diretamente
conta1 = ContaBancaria('Rafael', 2000)
conta2 = ContaBancaria('Henrique', 300)
conta3 = ContaBancaria('Isabelli', 50)

print(conta1)
print(conta2)
print(f'{conta3}\n')

# Verificando e ativando conta
print(f'Conta de {conta3.titular} ativa? {conta3.ativo}\n')
ContaBancaria.ativar_conta(conta3)
print(f'Conta de {conta3.titular} ativa? {conta3.ativo}\n')

Espero ter ajudado!

Um forte abraço e bons estudos!