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

Resolução de Atividades - 07 Hora da prática: criando classes, construtores e métodos

1) 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.

class ContaBancaria:

    def __init__ (self, titular = "", saldo = 0.0 ):

        self._titular = titular
        self._saldo = saldo
        self._ativo = False



2) 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.

    def __str__ (self):

        return f"Titular: {self._titular} | Saldo: R${self._saldo:.2f}"
    

conta_maria = ContaBancaria ("Maria", 1717)
conta_joao = ContaBancaria ("João", 12380)

print (conta_maria)
print (conta_joao)



3) 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:

[...]

    def ativar_conta (self):

        self._ativo = True

 
conta_joao = ContaBancaria ("João", 12380)
print (conta_joao)

conta_joao.ativar_conta()
print (conta_joao._ativo)

Nota: O exercício pede um método de classe, eu tentei usar o @classmethod, mas não consegui. O gabarito também não tinha. Aí ficou essa dúvida...



4) Refatore a classe ContaBancaria para utilizar a abordagem "pythonica" na criação de atributos. Utilize propriedades, se necessário.

    @property

    def titular (self):

        return self._titular
    
    @property

    def saldo (self):

        return self._saldo
    
    @property

    def ativo (self):

        return self._ativo

Dúvida: os @property são os getters e o setters? Porque aqui parece muito semelhante ao getter. Eles são para encapsulamento, certo?



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

conta_maria = ContaBancaria ("Maria", 1717)
print (conta_maria.titular)

Confesso que não entendi muito bem o propósito do @property. Okay, ele agora me permite imprimir diretamente a Maria, mas eu não poderia imprimir diretamente antes, só colocando o "_"?



6) 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.

class ClienteBanco:

    def __init__ (self, nome = "", cpf = "", genero = "", idade = int, salario = 0):

        self.nome = nome
        self._cpf = cpf
        self.genero = genero
        self._idade = idade
        self._salario = salario

    def __str__ (self):

        return f"Nome: {self.nome} | Idade: {self._idade} | Gênero: {self.genero} | CPF: {self._cpf} | Salário: R${self._salario}"
    
cliente_1 = ClienteBanco ("Maria", "123.456.789-00", "Feminino", 30, 5000)
cliente_2 = ClienteBanco ("João", "987.654.321-00", "Masculino", 40, 8000)
cliente_3 = ClienteBanco ("Ana", "456.789.123-00", "Feminino", 25, 3000)

print (cliente_1)
print (cliente_2)
print (cliente_3)



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


class ContaBancaria:

[...]

    @classmethod

    def criar_conta (cls, nome, cpf):

        conta = ContaBancaria (nome, cpf)
        
        
cliente_4 = ClienteBanco ("Roberto", "456.788.234-45", "Masculino", 76, 1230)
cliente_4.criar_conta("Roberto", "456.788.234-45")
print (cliente_4)

Eu também tive dificuldades em aplicar uma classe na outra. Não precisaria do fundamento da Herança? Ou seria o pilar da Abstração? Como saber quando usar o @classmethod?


Peço perdão pela quantidade de perguntas. Antes dos exercícios estava tudo tranquilo, mas aí agora surgiram várias. Mas antes tarde do que nunca kkkk. Já agradeço pela ajuda

2 respostas
solução!

Olá, Victor. Como vai?

Seu código está muito bem estruturado e demonstra que você compreendeu os conceitos fundamentais de Orientação a Objetos no Python. Suas dúvidas sobre @property e @classmethod são muito comuns e tocam no ponto central do que chamamos de código pythonico.

Vamos esclarecer esses pontos:

1. Sobre o @property (Encapsulamento)

Você está correto: o @property funciona como um getter. O propósito principal não é apenas permitir a impressão do valor, mas sim o encapsulamento.

  • Por que não usar o "_" diretamente? No Python, o prefixo _ (um underline) é apenas uma convenção para dizer a outros programadores que aquele atributo é "privado". Se você acessa conta._titular, você está quebrando essa convenção.
  • Vantagem: Com o @property, você pode adicionar uma lógica de proteção no futuro sem mudar a forma como as pessoas usam sua classe. Por exemplo, você pode formatar o nome do titular para sempre retornar em letras maiúsculas sem alterar o atributo original.

2. Diferença entre Método de Instância e Método de Classe

No item 3, você criou um método de instância, pois ele usa o self e altera um objeto específico. Já no item 7, você usou o @classmethod.

  • Método de Instância (self): Atua sobre uma conta específica (ex: ativar a conta do João).
  • Método de Classe (cls): Atua sobre a classe como um todo. Geralmente é usado para criar "fábricas" de objetos, como você tentou fazer no criar_conta.

Para o exercício 3, se quiser usar o @classmethod para algo como "ativar todas as contas", ele faria sentido. Mas para ativar uma conta específica, o seu código com self está semanticamente mais correto para a lógica de negócio, apesar do enunciado pedir especificamente o decorador.

3. Sugestão para o item 7

Notei que no seu item 7, você tentou criar um método de classe dentro de ContaBancaria que recebe dados de um ClienteBanco. Uma forma prática de aplicar o @classmethod seria:

class ContaBancaria:
    # ... outros métodos ...
    
    @classmethod
    def criar_conta(cls, titular, saldo_inicial):
        return cls(titular, saldo_inicial)

# Uso:
nova_conta = ContaBancaria.criar_conta("Roberto", 1000)

Isso permite criar instâncias de uma forma alternativa à chamada direta do construtor.

Continue praticando, pois o entendimento dessas "nuances" do Python vem com a repetição e o uso em projetos maiores!

Espero que possa ter lhe ajudado!

Oii monitor Everton, tudo bem? Obrigado pelas explicações. Realmente eu estava muitooo perdido kkkk. Mas cosegui me achar graças ao senhor. Muito obrigado pelo carinho =)