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

Propriedades e encapsulamento

Com as propriedades e o atributo.setter é possível acessar e setar diretamente o valor dos atributos. Isso não fere o encapsulamento?

2 respostas
solução!

Não necessáriamente, pense pois você pode controlar e validar os valores que podem ser setados, por exemplo imagene uma que na classe Conta tem uma método para alterar o limite, porém o mesmo nunca pode ser menor do que zero e também nunca pode ser maior do que 10.000, 00

class Conta:
    def __init__(self, saldo):
        self.__saldo = saldo
        self.__limite = 0

    @property
    def limite(self):
        return self.__limite

    @limite.setter
    def  limite(self, novo_limite):
        if (novo_limite >0 and novo_limite <= 10000):
            self.__limite = novo_limite
        else:
            print("Erro ao alterar o limite")

    def extrato(self):
        print('Limite: ' ,self.limite)

Daí podemos rodar o programa

# Criar conta e exibir extrato
conta = Conta(200)
conta.extrato()


# Tentar um valor negativo
conta.limite=-100
conta.extrato()


# Tentar um valor maior que 10.000
conta.limite=10001
conta.extrato()

# Tentar um valor válido
conta.limite=100
conta.extrato()

As saídas serão:

# python3 conta.py
# Criar conta e exibir extrato
Limite:  0

# Tentar um valor negativo
Erro ao alterar o limite
Limite:  0

# Tentar um valor maior que 10.000
Erro ao alterar o limite
Limite:  0

# Tentar um valor válido
Limite:  100

ou seja, o setar afeta diretamente o valor dos atributo, mas não fere o encapsulamento pois eu posso controlar o dado de entrada e o comportamento do meu metodo baseado no valor desse dado.

Muito bom. Resposta simples de entender e ilustrativa Obrigado!