Com as propriedades e o atributo.setter é possível acessar e setar diretamente o valor dos atributos. Isso não fere o encapsulamento?
Com as propriedades e o atributo.setter é possível acessar e setar diretamente o valor dos atributos. Isso não fere o encapsulamento?
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!