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

erro ao implementar passa_o_mes duck typing

Oi pessoal, tudo bem?

Estou exercitando os conceitos da aula e tentei seguir os passos que foram implementados na aula 02 da sessão 3, de "Listas e Polimorfismos". No entanto, fiquei preso na parte de instanciar um método de uma subclasse dentro de um laço "for" pelo conceito do DuckTyping. Veja que estou recebendo um erro "AttributeError: 'Conta' object has no attribute 'passa_mes'" quando eu tento receber o retorno do for no meu código que ficou assim:

class Conta:
  def __init__(self, numeroconta):
    self._numeroconta = numeroconta
    self._saldoconta = 0

  def depositaValor(self, valordeposito):
    self._saldoconta += valordeposito
  
  def __str__(self):
    return f' "Conta: {self._numeroconta} ; Saldo: {self._saldoconta}"'

class Contacorrente(Conta):
    def passa_mes(self):
      self._saldoconta -= + 1

class Contapoupanca(Conta):
  def passa_mes(self):
    self._saldoconta -= 3
    self._saldoconta *= 1.01
    
contaFulano = Conta(456)
contaFulano.depositaValor(1000)


contaSicrano = Contacorrente(789)
contaSicrano.depositaValor(2000)
#contaSicrano.passa_mes()

contaBeltrano = Contapoupanca(101112)
contaBeltrano.depositaValor(400)
#contaBeltrano.passa_mes()

print(contaFulano)
print(contaBeltrano)
print(contaSicrano)

agencia = [contaFulano, contaBeltrano, contaSicrano]

for contas in agencia:
  contas.passa_mes()
  

Emperrei num trecho simples, mas acho importante não deixar passar batido. Alguma sugestão?

Muito obrigado pelo apoio e parabéns pelo conteúdo e didática do curso.

2 respostas
solução!

Oie, Rafael! Tudo bem?

O erro indica que a classe Conta não possui o método passa_mes(). Isso acontece porque você definiu esse método apenas nas subclasses Contacorrente e Contapoupanca.

Para resolver esse problema, você pode definir o passa_mes() na classe Conta também. Todas as subclasses da Conta terão acesso a esse método.

Seu código ficaria assim:

class Conta:
  def __init__(self, numeroconta):
    self._numeroconta = numeroconta
    self._saldoconta = 0

  def depositaValor(self, valordeposito):
    self._saldoconta += valordeposito
  
  def __str__(self):
    return f' "Conta: {self._numeroconta} ; Saldo: {self._saldoconta}"'
  
  def passa_mes(self):
    pass

class Contacorrente(Conta):
    def passa_mes(self):
      self._saldoconta -= 1

class Contapoupanca(Conta):
  def passa_mes(self):
    self._saldoconta -= 3
    self._saldoconta *= 1.01
    
contaFulano = Conta(456)
contaFulano.depositaValor(1000)

contaSicrano = Contacorrente(789)
contaSicrano.depositaValor(2000)

contaBeltrano = Contapoupanca(101112)
contaBeltrano.depositaValor(400)

print(contaFulano)
print(contaBeltrano)
print(contaSicrano)

agencia = [contaFulano, contaBeltrano, contaSicrano]

for contas in agencia:
  contas.passa_mes()

Se a dúvida persistir, estamos disponíveis aqui.

Abraços!

Oi Isabel, tudo bem contigo?

Muito obrigado pela resposta! Tem toda razão, faltou implementar o método na classe raíz!! Isso explica muito sobre a importância de instanciar um método abstrato.

Inclusive, já avancei pra essa aula de métodos abstratos e ficou mais claro.

Obrigado novamente pelo apoio :)

Meu código depois do ajuste, somente para reforçar:

class Conta:

  def __init__(self, numeroconta, titular):
    self._titular = titular
    self._numeroconta = numeroconta
    self._saldoconta = 0

  def depositaValor(self, valordeposito):
    self._saldoconta += valordeposito

  def __str__(self):
    return f'   Titular: {self._titular} \n Conta: {self._numeroconta} \n Saldo: {self._saldoconta}'

  def passa_mes(self):
    pass


class Contacorrente(Conta):
  def passa_mes(self):
    self._saldoconta -= + 1

class Contapoupanca(Conta):
  def passa_mes(self):
    self._saldoconta -= 3
    self._saldoconta *= 1.01

class ContaInvestimento(Conta):
  pass

contaZezinho = Contacorrente(123, 'Zezinho')
contaHuguinho = Contapoupanca(456, 'Hughuinho')
contaLuizinho = Conta(789, 'Luizinho')

contaZezinho.depositaValor(900)
contaHuguinho.depositaValor(1200)
contaLuizinho.depositaValor(634)

lista_de_contas = [contaZezinho, contaHuguinho, contaLuizinho]



for contas in lista_de_contas:
    contas.passa_mes()
    print (contas)