1
resposta

Duvida

Diferença entre essas partes

class ContaBancaria:
  def __init__(self, titular, saldo):
    self._titular = titular  # Atributo privado para titular
    self._saldo = saldo  # Atributo privado para saldo
    self._ativo = False  # Atributo de instância, inicialmente False

def __str__(self):
    return f'Titular: {self._titular}\nSaldo: {self._saldo}\nAtivo: {self._ativo}'

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

class ContaBancaria:

def __init__(self, titular, saldo):
    self.titular = titular
    self._saldo = saldo
    self._ativo = False

def __str__(self):
    return f'Titular: {self.titular}\nSaldo: {self._saldo}\nAtivo: {self._ativo}'

def ativar_conta(self):
    self._ativo = True
1 resposta

Certo, dei uma olhada e duas versões da classe ContaBancaria têm diferenças importantes:

Primeiro, o uso de atributos "privados" Na primeira versão, os atributos _titular e saldo começam com um underscore (_), indicando que são pseudo-privados, ou seja, não devem ser acessados diretamente fora da classe. Na segunda versão, titular é público (não tem _), enquanto _saldo e _ativo continuam como pseudo-privados.

Segunda diferença no método para ativar a conta Na primeira versão a ativação da conta é feita por um método de classe (@classmethod), que recebe a conta como parâmetro e altera o atributo _ativo. Isso significa que um objeto externo pode ativar a conta sem precisar chamar um método diretamente no objeto. (vc pode fazer ContaBancaria.ativar_conta(conta))

Já na segunda versão o método ativar_conta é um método de instância, ou seja, precisa ser chamado diretamente no objeto (conta.ativar_conta()). Faz mais sentido, pois normalmente a ativação deve ser uma ação do próprio objeto.