- Nessa aula vamos aprender um dos importantes pilares da orientação a objetos, o encapsulamento.
- Até aqui você pode notar a facilidade com que temos manipulado os atributos de uma classe, não é verdade? Bem, se estivéssemos mapeando um sistema de natureza mais crítica seria inviável fornecer tamanha flexibilidade para manipulação diretamente dos atributos.
- Imagine por exemplo uma classe Conta Corrente, onde pudéssemos atribuir o valor de conta corrente diretamente para cada correntista, quão confiável esse sistema seria? Pensando nisso, temos então o pilar do encapsulamento para nos ajudar com essa questão.
- A analogia mais simples de entender o encapsulamento, é um remédio de cápsula. O essencial do remédio é o que está protegido dentro da cápsula, para que aquele conteúdo não seja alterado.
- E trazendo para a orientação a objetos, o nosso objetivo é proteger o acesso aos atributos, possibilitando o acesso a leitura ou escrita destes atributos, somente via métodos.

- Pensando nisso, vamos criar o arquivo 8-encapsulamento.py.
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
# Aplicando o Encapsulamento
#self.__salary = salary
def show(self):
# accessing public data member
print(f"Nome: {self.name} Salário: {self.salary}")
fulano = Employee("Fulano", 4000)
sicrano = Employee("Sicrano", 10000)
fulano.name = "Fulano 2"
fulano.salary = 40000
fulano.show()
sicrano.show()
- Para executar o arquivo, podemos definir o comando: python .\8-encapsulamento.py

- Note que no nosso projeto, nós estamos conseguindo modificar tranquilamente todos os atributos, inclusive o atributo salário. Só que isso, não seria uma boa escolha, não é verdade?
- Para resolver essa questão, podemos tornar esse atributo como privado.
class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = salary
def show(self):
# accessing public data member
print(f"Nome: {self.name} Salário: {self.__salary}")
fulano = Employee("Fulano", 4000)
sicrano = Employee("Sicrano", 10000)
fulano.name = "Fulano 2"
fulano.__salary = 40000
fulano.show()
sicrano.show()

- Note que agora mesmo tendo modificar o valor de salário, nossa classe não permite, pois o atributo está como privado.