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

Como acessar um atributo privado em uma classe?

Escreva um programa de bancos que possua:

Uma classe Banco com os atributos - private total - public TaxaReserva - private reservaExigida

E métodos - public podeFazerEmprestimo(valor) --> bool - public MudaTotal(valor)

E uma classe conta com os atributos - private saldo - private ID - private senha

E métodos - public deposito(senha, valor) - public saque(senha, valor) - public podeReceberEmprestimo(valor) --> bool - public saldo --> float

SOlução:

class Banco(object):
    __total =10000
    TaxaReserva = 0.1
    __reservaExigida = __total*TaxaReserva
    def podeFazerEmprestimo(self,valor):
        if self.__saldo >= 1000:
            return True

    def MudaTotal(self,valor):
        Banco.__total += valor
        return Banco.__total





class Conta(Banco):
    def __init__(self,saldo,ID,senha):

        self.__saldo = saldo
        self.__ID = ID
        self.__senha = senha

    def deposito(self,senha, valor):
        Conta.__saldo += valor

    def saque(self,senha, valor):
        if (senha == self.__senha) and (valor <= self.__saldo) :
            self.__saldo -= valor
    def podeReceberEmprestimo(self,valor):
        pass

    def saldo(self):
        return self.__saldo

##    def __call__(self,x):  # torna a instância callable!
##        return x




itau = Conta(1000,123456,"POO")
itau.saque("POO",200)
print(itau.saldo())
#print(callable(itau)) #é instancia! não é callable! exceto se criar  __call__
#print(callable(Conta))# é callable!
#print(callable(itau)) se criar o def __call___, torna-se callable!
print(Banco.total)

Erro:

O erro é no Banco.total, que é privado:

"AttributeError: type object 'Banco' has no attribute 'total'"

Como acessar o atributo privado?

3 respostas

Você pode fazer como na Conta e criar um método que retorne; ou você pode acessar por:

Banco._Banco__total

Não entendi o Banco._Bancototal Por que não apenas Bancototal?

solução!

Quando você cria uma variável "privada" em Python o que acontece é: dentro da classe você pode referenciar por __variavel mas fora da classe o Python "esconde" este acesso para lembrar ao desenvolvedor que ele não deveria mexer diretamente naquela variável(pois ela é privada), mas não o impede(como em outras linguagens, como Java). Não impede pois o ato de esconder é simplesmente renomear a variável para _Classe__variavel.

Por este motivo você pode acessar variaveis privadas em Python através da sintaxe _NomeDaClasse__nomeDaVariavel.