2
respostas

[Reclamação] ERRO no enunciado do exercício e na resolução: 07 Hora da prática: criando classes, construtores e métodos

Os desafios da: 07 Hora da prática: criando classes, construtores e métodos, apresentam problemas conceituais importantes que prejudicam o aprendizado de orientação a objetos.

  • Esse ERRO/BUG já foi apontado por outros alunos e mesmo assim o exercício continua sendo sugerido com erro, sem a devida correção. Gostaria de entender o porquê? Não é a primeira vez que vou fazer um exercício que vejo que tem erro e quando olho no fórum outros alunos já apontaram o mesmo erro meses ou até anos atrás e ainda assim o exercício não foi corrigido.
  1. Primeiro pede para:

"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."

  1. Depois no ponto 3 está o erro crucial:

"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."

O enunciado solicita um método de classe (@classmethod) que deve alterar o atributo ativo de uma instância específica.
Isso é tecnicamente incorreto: métodos de classe trabalham com a classe, não com instâncias.
A solução fornecida utiliza @classmethod recebendo uma instância como argumento, o que viola sua finalidade e gera um uso equivocado do recurso.

A solução oficial implementa:

# 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.
    @classmethod
    def ativar_conta(cls, conta):
        conta._ativo = True

conta3 = ContaBancaria("Carlos", 200)
print(f"Antes de ativar: Conta ativa? {conta3._ativo}")
ContaBancaria.ativar_conta(conta3)
print(f"Depois de ativar: Conta ativa? {conta3._ativo}")

Isso equivale a um método comum, tornando o uso de @classmethod artificial e incorreto.
Didaticamente, isso ensina o uso errado de um dos principais mecanismos de OOP em Python.

Na etapa seguinte (“Refatore para a forma pythonica”), apenas o construtor é refatorado.
O exercício, porém, não refatora o método do passo anterior nem corrige o uso indevido do método de classe.
Isso gera inconsistência entre as etapas e reforça o erro conceitual.

# 4) Refatore a classe `ContaBancaria` para utilizar a abordagem "pythonica" na criação de atributos. Utilize propriedades, se necessário.
class ContaBancariaPythonica:
    def __init__(self, titular, saldo):
        self._titular = titular
        self._saldo = saldo
        self._ativo = False

    @property
    def titular(self):
        return self._titular

    @property
    def saldo(self):
        return self._saldo

    @property
    def ativo(self):
        return self._ativo

A classe refatorada ignora completamente o método ativar_conta do exercício anterior, como se fosse uma classe nova e independente, quebrando a continuidade do aprendizado.

Esses pontos tornam o exercício incoerente e podem levar o aluno a aprender conceitos errados sobre métodos de classe e boas práticas de design em Python.

2 respostas

Oi Thaís, como vai?

Realmente, o uso de @classmethod para alterar atributos de instância não é a prática correta, já que métodos de classe são destinados a operar sobre a classe em si, e não sobre instâncias específicas.

Para corrigir isso, o método ativar_conta deveria ser um método de instância, e não um método de classe. Aqui está um exemplo de como isso poderia ser implementado corretamente:

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

    def ativar_conta(self):
        self._ativo = True

    def __str__(self):
        return f"Titular: {self._titular}, Saldo: {self._saldo}"

# Criação de uma instância e ativação da conta
conta = ContaBancaria("Carlos", 200)
print(f"Antes de ativar: Conta ativa? {conta._ativo}")
conta.ativar_conta()
print(f"Depois de ativar: Conta ativa? {conta._ativo}")

Além disso, na refatoração para a forma "pythonica", seria interessante incluir o método ativar_conta na nova classe, mantendo a continuidade e coerência do aprendizado. Aqui está um exemplo de como poderia ser feito:

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

    @property
    def titular(self):
        return self._titular

    @property
    def saldo(self):
        return self._saldo

    @property
    def ativo(self):
        return self._ativo

    def ativar_conta(self):
        self._ativo = True

Espero que isso ajude a esclarecer a questão e a corrigir o problema.

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

O problema maior é que eu quero saber se a questão em si será corrigida, bem como a resposta dada na opnião do instrutor? Como podemos reportar para que a correção seja feita e evite que outros alunos fiquem aprendendo de maneira errada.

  • Quero evitar que esse seja mais um tópico que levanta um erro importante no exercício e a correção se mantém apenas no fórum, mas a fonte do problema nao é corrigido!

  • Como observei, certos erros nos exercícios são levantados há anos no fórum e continuam no material oficial do curso. Esse tipo de situação me deixa com a impressão de DESCASO DA INSTITUIÇÃO COM OS SEUS ALUNOS, pois os erros não são desconhecidos, se a Alura quisesse demonstrar cuidado com os cursos oferecidos, teria corrigido a partir do primeiro BUG/SUGESTÃO/DÚVIDA no fórum.

  • As correções evitariam confusões, perda de tempo e o risco de ensinar algo errado a alunos iniciantes.

Por favor, me diga como reportar para que esse tipo de erro seja corrigido.
Obrigada.