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

[Dúvida] RESOLUÇÃO

#Desafios #Crie uma classe chamada ContaBancaria com um construtor que aceita os parâmetros titular e saldo.

Inicie o atributo ativo como False por padrão.

#Na classe ContaBancaria, adicione um método especial str que retorna uma mensagem formatada com o titular e o saldo da conta.

Crie duas instâncias da classe e imprima essas instâncias.

#Adicione um método de classe chamado ativar_conta à classe ContaBancaria que define o atributo ativo como True.

Crie uma instância da classe, chame o método de classe e imprima o valor de ativo.

class ContaBancaria:
    Conta = []

    def __init__(self, titular='', saldo=float):
        self.titular = titular
        self.saldo = saldo
        self.status = False
        ContaBancaria.Conta.append(self)
    
    def __str__(self):
        return f'{self.titular} | {self.saldo} | {self.status}'
    

    @classmethod
    def mudanca_status(cls,conta):
        print(f'{'Titular da conta'.ljust(25)} | {'Saldo'.ljust(25)} | {'Status'}')
        
        for ContaBancaria in cls.Conta:
            if conta.status== False: conta.status= not conta.status  
            else: conta.status
            
        print(f'{ContaBancaria.titular.ljust(25)} | {ContaBancaria.saldo.ljust(25)} | {ContaBancaria.status}')
        
Conta_andre = ContaBancaria('André', 12.35)
Conta_catia = ContaBancaria('Catia', 15)

#Refatore a classe ContaBancaria para utilizar a abordagem "pythonica" na criação de atributos.

Utilize propriedades, se necessário.

#Crie uma instância da classe e imprima o valor da propriedade titular.

class ContaBancaria2:
    def __init__(self, titular2='', saldo2=float):
        self._titular2 = titular2
        self._saldo2 = saldo2
        self.ativo = False

    def __str__(self):
        return f'Sr {self._titular2} segue o saldo da sua conta {self._saldo2}'
        
    @property
    def titular2(self):
        return self._titular2
    
    def saldo2(self):
        return self._saldo2

    
Conta03= ContaBancaria2('Luiz',3333.33)
print(Conta03)

#Crie uma classe chamada ClienteBanco com um construtor que aceita 5 atributos.

Instancie 3 objetos desta classe e atribua valores aos seus atributos através do método construtor.

#Crie um método de classe para a conta ClienteBanco.

class ClienteBanco:
    Clientes= []

    def __init__(self, titular3='', saldo3=float, cpf = '', telefone = '', cep = ''):
        self._titular3 = titular3
        self._saldo3 = saldo3
        self._cpf = cpf
        self._telefone = telefone
        self._cep = cep
        self._ativo = False

    def __str__(self):
        return f'{ClienteBanco._titular3} | {ClienteBanco._saldo3} | {ClienteBanco._cpf} | {ClienteBanco._telefone} | {ClienteBanco._cep} | {ClienteBanco._ativo}'

        
Conta04= ClienteBanco('Andre',3333.33, '13453566769','2199999999', '22785600')
conta05= ClienteBanco('Lorena',3333.33, '13453566769','2199999999', '22785600')
Conta06 = ClienteBanco('Lorraine',3333.33, '13453566769','2199999999', '22785600')
    
@classmethod
def ClienteBanco_Class(cls):
    for ClienteBanco in cls.Clientes:
        print (f'{ClienteBanco._titular3} | {ClienteBanco._saldo3} | {ClienteBanco._cpf} | {ClienteBanco._telefone} | {ClienteBanco._cep | {ClienteBanco._ativo}}')
9 respostas

Pessoal,

No primeiro bloco e no último bloco o meu VisualCode não me retornar nenhum valor, nem mesmo erro.

Tem algum erro que não estou conseguindo identificar? No aguardo, obg.

Olá, Larissa.

Tudo bem?

Vou focar nos dois que você destacou, que é o primeiro e o último.

  • Seu primeiro código possui alguns erros e áreas que podem ser melhoradas. Vou detalhar as correções e melhorias necessárias
  1. O parâmetro saldo deve ser um número (float) e não a classe float.
  2. No método mudanca_status, há um erro na lógica para imprimir as contas e mudar o status.
  3. No método mudanca_status, a formatação da string print está incorreta.
  4. A lista Conta pode ser renomeada para contas para seguir a convenção de nomes em minúsculas para atributos de classe.
  5. No método __str__, é melhor formatar o saldo como uma string para garantir a consistência na impressão.

Aqui está o código corrigido:

class ContaBancaria:
    contas = []

    def __init__(self, titular='', saldo=0.0):
        self.titular = titular
        self.saldo = saldo
        self.status = False
        ContaBancaria.contas.append(self)
    
    def __str__(self):
        return f'{self.titular} | {self.saldo:.2f} | {self.status}'
    
    @classmethod
    def mudanca_status(cls, conta):
        print(f'{"Titular da conta".ljust(25)} | {"Saldo".ljust(25)} | {"Status"}')
        
        for conta in cls.contas:
            if conta.status == False:
                conta.status = not conta.status
            print(f'{conta.titular.ljust(25)} | {str(conta.saldo).ljust(25)} | {conta.status}')
        
Conta_andre = ContaBancaria('André', 12.35)
Conta_catia = ContaBancaria('Catia', 15)

ContaBancaria.mudanca_status(Conta_andre)

Nesse código:

  • O construtor __init__ agora inicializa saldo com 0.0 se nenhum valor for fornecido.
  • A lista de contas foi renomeada para contas seguindo a convenção de nomes de atributos de classe.
  • No método mudanca_status, a lógica para mudar o status da conta e imprimir as contas foi corrigida.
  • A formatação da impressão no método mudanca_status foi ajustada para garantir que os valores de saldo sejam strings.

Essa versão do código deve funcionar corretamente e fazer o que você deseja.

  • Sobre o último seu código possui alguns erros também e pode ser melhorado. Veja:
  1. A lista de clientes Clientes não está sendo utilizada corretamente. Os objetos ClienteBanco criados precisam ser adicionados a essa lista.
  2. O construtor deve inicializar os valores de forma adequada.
  3. O método __str__ deve acessar os atributos de instância, não os da classe.
  4. O método de classe ClienteBanco_Class precisa ser definido dentro da classe ClienteBanco.
  5. A formatação de impressão no método ClienteBanco_Class tem um erro de sintaxe.

Código corrigido:

class ClienteBanco:
    clientes = []

    def __init__(self, titular='', saldo=0.0, cpf='', telefone='', cep=''):
        self._titular = titular
        self._saldo = saldo
        self._cpf = cpf
        self._telefone = telefone
        self._cep = cep
        self._ativo = False
        ClienteBanco.clientes.append(self)

    def __str__(self):
        return f'{self._titular} | {self._saldo:.2f} | {self._cpf} | {self._telefone} | {self._cep} | {self._ativo}'

    @classmethod
    def listar_clientes(cls):
        for cliente in cls.clientes:
            print(f'{cliente._titular} | {cliente._saldo:.2f} | {cliente._cpf} | {cliente._telefone} | {cliente._cep} | {cliente._ativo}')


# Instanciando os objetos
conta04 = ClienteBanco('Andre', 3333.33, '13453566769', '2199999999', '22785600')
conta05 = ClienteBanco('Lorena', 3333.33, '13453566769', '2199999999', '22785600')
conta06 = ClienteBanco('Lorraine', 3333.33, '13453566769', '2199999999', '22785600')

# Listando os clientes
ClienteBanco.listar_clientes()

Mudanças no código:

  1. A lista de clientes foi renomeada para clientes e os objetos são adicionados a essa lista no construtor.
  2. Os parâmetros do construtor agora têm valores padrão apropriados.
  3. O método __str__ foi corrigido para acessar os atributos de instância.
  4. O método listar_clientes foi corrigido e agora está definido corretamente dentro da classe ClienteBanco.
  5. A formatação de impressão no método listar_clientes foi corrigida.

Essa versão do código deve funcionar corretamente e atender às suas necessidades.

Espero ter ajudado e bons estudos!

Muito obrigada pela explicação, mas ainda ficaram algumas dúvidas.

  1. Porque no código return f'{self.titular} | {self.saldo:.2f} | {self.status}' o saldo tem a diferença dos demais? self.saldo:2f O que significa esse :2f?
  2. Porque o código de listar a estrutura do primeiro é diferente do segundo?
 @classmethod
    def mudanca_status(cls,conta):
        for ContaBancaria in cls.Conta:
@classmethod
    def listar_clientes(cls):
        for cliente in cls.clientes:
    

Quando eu sei quando eu uso a estrutra do primeiro ou do segundo?

Obrigada e no aguardo.

Oi Larissa.

  • :.2f formata o número self.saldo com duas casas decimais.
  • Exemplo: 123.456 será exibido como 123.46.

2. Diferença na estrutura dos métodos mudanca_status e listar_clientes

  • mudanca_status:

    • Itera sobre cls.Conta.
    • Usado para alterar o status das contas.
  • listar_clientes:

    • Itera sobre cls.clientes.
    • Usado para listar os clientes.

Quando usar cada estrutura?

  • Iteração sobre cls.Conta: Para acessar/modificar contas.
  • Iteração sobre cls.clientes: Para acessar/listar clientes.

Espero que isso ajude. Qualquer dúvida estou à disposição.

Olá Renan, ainda não ficou claro para mim!

No primeiro código você usou o conta, como parametro dentro da função:

@classmethod def mudanca_status(cls,conta):

Na seguna opção, não foi feita dessa forma, foi somente chamado a classe:

@classmethod def listar_clientes(cls):

Essa diferença eu não consegui ainda entender, e quando sei que preciso incluir a lista como parâmetro ou não.

Outro detalhe, é que a forma como o código ficou eu necessariamente precisaria realizar a modificação de status das contas bancarias, um por um, como o exemplo do código final


ContaBancaria.mudanca_status(Conta_andre)

Como eu faria para realizar a modificação da lista por inteiro? Sem que haja a necessidade de estar incluindo os objetos dentro da função?

Aguardo o retorno, obg.

Oi, Larissa.

1. Sobre :.2f

O :.2f é uma forma de formatar números de ponto flutuante (floats) para que sejam exibidos com duas casas decimais. Ele é muito útil para garantir que valores monetários, por exemplo, sejam apresentados de forma consistente.

saldo = 123.456
print(f'{saldo:.2f}')  # Resultado: 123.46

2. Diferença na Estrutura dos Métodos

Vamos analisar as diferenças entre os métodos mudanca_status e listar_clientes.

mudanca_status

@classmethod
def mudanca_status(cls, conta):
    for conta in cls.contas:
        if conta.status == False:
            conta.status = not conta.status
        print(f'{conta.titular.ljust(25)} | {str(conta.saldo).ljust(25)} | {conta.status}')

Neste método, o parâmetro conta é passado, mas não é usado dentro do método. Isso não é necessário e pode ser removido. A estrutura correta seria:

@classmethod
def mudanca_status(cls):
    for conta in cls.contas:
        if conta.status == False:
            conta.status = not conta.status
        print(f'{conta.titular.ljust(25)} | {str(conta.saldo).ljust(25)} | {conta.status}')

listar_clientes

@classmethod
def listar_clientes(cls):
    for cliente in cls.clientes:
        print(f'{cliente._titular} | {cliente._saldo:.2f} | {cliente._cpf} | {cliente._telefone} | {cliente._cep} | {cliente._ativo}')

Neste método, não há necessidade de um parâmetro adicional porque estamos apenas iterando sobre todos os clientes na lista cls.clientes.

3. Quando Incluir a Lista como Parâmetro

A inclusão da lista como parâmetro só é necessária se você precisar modificar ou acessar a lista passada como argumento. No caso dos métodos de classe que operam sobre todos os elementos de uma lista interna da classe, não é necessário um parâmetro adicional.

4. Modificando o Status de Todas as Contas

Para modificar o status de todas as contas sem precisar passar cada objeto individualmente, você pode simplificar o método mudanca_status para iterar sobre todos os elementos na lista contas.

class ContaBancaria:
    contas = []

    def __init__(self, titular='', saldo=0.0):
        self.titular = titular
        self.saldo = saldo
        self.status = False
        ContaBancaria.contas.append(self)
    
    def __str__(self):
        return f'{self.titular} | {self.saldo:.2f} | {self.status}'
    
    @classmethod
    def mudar_status_todas(cls):
        for conta in cls.contas:
            conta.status = not conta.status
            print(f'{conta.titular.ljust(25)} | {str(conta.saldo).ljust(25)} | {conta.status}')

# Criando instâncias
Conta_andre = ContaBancaria('André', 12.35)
Conta_catia = ContaBancaria('Catia', 15)

# Modificando o status de todas as contas
ContaBancaria.mudar_status_todas()

Em resumo

  • Use :.2f para formatar números de ponto flutuante com duas casas decimais.
  • Inclua parâmetros adicionais em métodos de classe somente quando necessário.
  • Para modificar todas as contas de uma lista, itere sobre a lista interna da classe sem passar parâmetros adicionais.

Espero que agora tenha ficado mais claro! Qualquer dúvida adicional, estou à disposição.

Mas quando você faz dessa forma conta.status = not conta.status isso não pode transformar o True em False? Hipoteticamente falando, caso eu já tenha um restaurante já ativado ele não transformaria o restaurante em desativado?

Obrigada,

solução!

Oi, Larissa.

Sim, você está correta. O uso de conta.status = not conta.status vai inverter o valor atual do status, ou seja, se for True, será alterado para False, e vice-versa. Se a intenção é apenas ativar todas as contas, sem desativar as que já estão ativas, então precisamos ajustar a lógica para garantir que apenas as contas inativas sejam ativadas.

Você pode ajustar o método mudar_status_todas para garantir que apenas as contas inativas sejam ativadas:

class ContaBancaria:
    contas = []

    def __init__(self, titular='', saldo=0.0):
        self.titular = titular
        self.saldo = saldo
        self.status = False
        ContaBancaria.contas.append(self)
    
    def __str__(self):
        return f'{self.titular} | {self.saldo:.2f} | {self.status}'
    
    @classmethod
    def ativar_todas(cls):
        for conta in cls.contas:
            if not conta.status:  # Apenas ativa se estiver desativada
                conta.status = True
            print(f'{conta.titular.ljust(25)} | {str(conta.saldo).ljust(25)} | {conta.status}')

# Criando instâncias
Conta_andre = ContaBancaria('André', 12.35)
Conta_catia = ContaBancaria('Catia', 15)

# Ativando todas as contas
ContaBancaria.ativar_todas()
  • if not conta.status: verifica se o status é False (inativo).
  • conta.status = True ativa a conta, garantindo que contas já ativas permaneçam ativas.
  • O método ativar_todas é chamado sem passar nenhum parâmetro adicional, ativando todas as contas inativas.

Dessa forma, as contas já ativas não serão desativadas por engano.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.