1
resposta

[Dúvida] duvida sobre o exercicio 3

eu fiz o exercicio 3 sem usar @classmethod e acho que funcionou da mesma maneira, eu gostaria de entender porque na opiniao do instrutor ele usou:

      def ativar_conta(cls, conta):
            conta._ativo = True

eu, porem fiz da seguinte maneira meu codigo:

    class ContaBancaria:

        def __init__(self, titular= '', saldo= 0, ativo = False):
            self.titular = titular.title()
            self.saldo = float(saldo)
            self._ativo = ativo 

        def __str__(self):
            return f'O Sr(a) {self.titular} tem R${self.saldo:.2f} na conta'

        def ativar_conta(self):
            self._ativo = not self._ativo

        @property
        def imprimir(self):
            return f'Sua conta, {self.titular}, está ativa' if self._ativo else f'Sua conta, {self.titular}, não está ativa'

    pessoa1 = ContaBancaria('Rodrigo', 1000)
    pessoa2 = ContaBancaria('Paulo', 5000)
    pessoa1.ativar_conta()
    print(pessoa1.imprimir)

    print(pessoa1)
    print(pessoa2)
1 resposta

Oi Rodrigo! Tudo bem?

No seu código, você criou o método ativar_conta como um método de instância, o que significa que ele precisa ser chamado em uma instância específica da classe ContaBancaria. Veja como você fez:

class ContaBancaria:
    # outros métodos e atributos

    def ativar_conta(self):
        self._ativo = not self._ativo

E você chama esse método assim:

pessoa1 = ContaBancaria('Rodrigo', 1000)
pessoa1.ativar_conta()

Essa abordagem funciona perfeitamente e é válida. No entanto, o instrutor utilizou @classmethod no exemplo dele, que é uma maneira diferente de estruturar o código. Um @classmethod é um método que recebe a própria classe como primeiro argumento (geralmente chamado de cls) ao invés de uma instância da classe. Isso permite que o método seja chamado diretamente na classe, sem precisar de uma instância específica.

Aqui está o exemplo do instrutor:

class ContaBancaria:
    # outros métodos e atributos

    @classmethod
    def ativar_conta(cls, conta):
        conta._ativo = True

E você chamaria esse método assim:

pessoa1 = ContaBancaria('Rodrigo', 1000)
ContaBancaria.ativar_conta(pessoa1)

A principal diferença é que o método de classe pode ser útil quando você precisa de um método que opere em várias instâncias ou quando a lógica do método não depende de uma instância específica, mas sim da classe como um todo.

No seu caso, como você está apenas ativando uma conta específica, ambas as abordagens funcionam. A escolha entre usar um método de instância ou um método de classe pode depender do contexto e de como você prefere estruturar o seu código.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.