Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Continuo tendo acesso a mudar atributos encapsulados

Estou com um problema seguindo essa aula.

Deu a entender que fazendo o encapsulamento, não é possível modificar os atributos de fora. Correto? Pois bem, segue o código:

class Conta:

    def __init__(self, numero, titular, saldo, limite):
        print("Construindo objeto ... {}".format(self))
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite
    def extrato(self):
        print ('Saldo de {} para {}'.format(self.__saldo,self.__titular))

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

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

No console eu crio uma conta qualquer:

conta= Conta(123, 'Henrique', 100, 1000)

Mas quando eu faço o seguinte comando:

conta._Conta__saldo = 1000

Ele atualiza do mesmo modo o saldo da conta. Ele avisa que o atributo é protegido, mas permite atualizar. É assim mesmo?

1 resposta
solução!

Olá Henrique, tudo bem com você?

Fico feliz que tenha levantado esse questionamento. O encapsulamento tanto de métodos, quanto de atributos no Python, é um assunto que desperta diversas opiniões, isso por não ser algo obrigatório da linguagem - embora, seja extremamente importante definir a visibilidade de métodos e atributos quando se trabalha com orientação a objetos. Em Python não teremos um atributo ou método 100% privado.

Assim devemos contar com o profissionalismo das(os) programadoras(es) de que irão respeitar as convenções definidas pela comunidade e pela linguagem Python, compreender e respeitar essas convenções faz parte de nossa jornada de aprendizado com o objetivo a excelência.

Também, é importante dizer que não será possível invocar diretamente métodos que possuam duplo underscore fora da classe (através de objetos), como apresentado abaixo:

conta = Conta(123, 'Henrique', 100, 1000)
conta.saldo = 500.0
conta.extrato()

Resultado

Saldo de 100 para Henrique

O acesso é limitado devido ao name mangling, que se trata de uma mudança no nome do método ou atributo para dificultar a leitura direta, adicionando o nome da classe a frente do nome do atributo, com a seguinte sintaxe.

objeto._<nome_da_classe>__<nome_do_metodo_privado>

Mas, reforço que apesar de dificultar, seu acesso não é impossível, como apresentado na sua postagem, o acesso pode ser realizado, contornando o name mangling. Como apresentado abaixo:

conta = Conta(123, 'Henrique', 100, 1000)
conta._Conta__saldo = 1000
conta.extrato()

Resultado

Saldo de 1000 para Henrique

Em resumo temos que o comportamento percebido por você é um comportamento esperado, devido à linguagem Python possuir um método 100% privado e quando burlamos o name mangling podemos realizar mudanças no método.

Para aprimorar ainda mais o seu aprendizado sobre atributos, métodos privados e até mesmo sobre name mangling, recomendo a leitura dos seguintes artigos.

O conteúdo recomendado acima está em inglês, o uso da língua inglesa é bem comum na área de tecnologia, mas não se preocupe, caso não tenha afinidade com essa linguagem, recomendo que utilize o tradutor do navegador para uma melhor compressã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!