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

Problema com retorno de valores da classe

Olá!

Parece que meu código não está reconhecendo os valores com underscore (.__ saldo, .__ limite, etc)

class ContaC:

    def __init__(self, numero, titular, saldo, limite):
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite

    def extrato(self):
        print(f'Saldo {self.__saldo} do titular {self.__titular}')

    def deposita(self, valor):
        self.__saldo += valor

    def saca(self, valor):
        self.__saldo -= valor

    def tranfere(self, valor, destino ):
        self.saca(valor)
        destino.deposita(valor)

conta = ContaC(123,"Nico", 1000, 10000)
print(conta._ContaC.__saldo)

Além de ter que digitar manualmente a última linha (Pois não aparece a opção para selecionar o __ saldo), surge um erro que diz:

print(conta._ContaC.__saldo)
      ^^^^^^^^^^^^

AttributeError: 'ContaC' object has no attribute '_ContaC'

O que está errado nesse código?

Agradeço desde já.

4 respostas
solução!

Olá Hugo, tudo bem com você?

O erro, AttributeError: 'ContaC' object has no attribute '_ContaC', está sendo levantado devido ao uso de um ponto (.) entre _ContaC e __saldo no momento em que é realizado a impressão do saldo, fazendo com que o Python intérprete _ContaC como um atributo e não como uma classe, gerando o erro.

Para acessarmos um atributo privado com duplo underscore (__), usamos a sintaxe abaixo.

objeto._<nome_da_classe>__<nome_do_atributo_privado>

Basta retirar o ponto (.) que foi adicionado entre _ContaC e __saldo no momento da impressão, ficando como apresentado abaixo.

print(conta._ContaC__saldo)

Após realizar a modificação acima, salve o arquivo e execute-o.

Lembre-se que pode contar sempre com o fórum Alura, seja para tirar suas dúvidas ou para compartilhar o seu desenvolvimento.

Fico à disposição.

Abraços e bons estudos.

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

Funcionou! O valor retornou aqui no print.

Muito obrigado!

Aproveitando o tópico, você saberia me dizer o motivo de não aparecer a opção para os valores com underscore? (.__ saldo, .__ limite, etc).

E não dá erro, mas agora aparece um alerta escrito: Unresolved attribute reference 'ContaC_saldo' for class 'ContaC'

Agradeço novamente!

Olá Hugo,

Agradeço pelo seu retorno informando que a impressão ocorreu como esperado.

A mensagem Unresolved attribute reference 'ContaC_saldo' for class 'ContaC' é apenas um warning (aviso) da IDE informando que ela não foi capaz de encontrar uma referência para o atributo que estamos acessando, mas, não gera impactos no funcionamento do código.

Fico feliz que tenha levantado o questionamento sobre os atributos privados. No Python temos por convenção o uso do underscore (_) antes do nome de um atributo para deixá-lo como privado (encapsulado). Quando deixamos um atributo privado não será possível invocá-lo diretamente através de um objeto. Por isso os atributos __saldo e __ limite não ficam mais disponíveis para acesso no objeto conta.

O acesso é limitado devido ao name mangling, que se trata de uma mudança no nome do atributo para dificultar a leitura direta. Assim nos códigos acima, foi necessário usarmos a seguinte sintaxe: conta._ContaC__saldo no lugar de conta.saldo para burlar o name mangling.

Na aula Getters e Setters o professor irá abordar com detalhes como podemos fazer o acesso a atributos privados de uma forma Pythonica utilizando métodos de classes sem a necessidade de burlarmos o name mangling .

Para saber mais sobre atributos privados no python e sobre name mangling, recomendo que leia a postagem disponível no link abaixo, onde explico sobre os atributos privados no Python e o comportamento do name mangling.

Fico à disposição.

Abraços e bons estudos.

Muito obrigado Felippe! Me ajudou muito!