Aula 5: O Pilar do Encapsulamento

Protegendo e organizando seus dados.

O Que Você Vai Aprender

Nesta aula, você explorará o Encapsulamento, um dos quatro pilares fundamentais da Programação Orientada a Objetos (POO). Entenderá como ele ajuda a organizar e proteger os dados dentro de uma classe, garantindo que o acesso e a modificação de atributos ocorram de forma controlada e segura.

🔒 Conceito de Encapsulamento

Compreender a ideia de agrupar dados e métodos em uma unidade, escondendo detalhes internos.

🎯 Objetivo Principal

Entender como o encapsulamento evita o acesso direto e modificações indevidas aos atributos.

Conceito: O que é o Encapsulamento?

O Encapsulamento, em POO, é a ideia de agrupar os dados (atributos) de um objeto e os métodos (funções) que manipulam esses dados dentro de uma única unidade, que é a classe. É como uma cápsula, onde tudo o que é necessário para o objeto funcionar está contido ali, e os detalhes internos de como ele funciona são "escondidos" do mundo exterior.

Analogia da Máquina de Café

Pense em uma máquina de café. Você sabe como usá-la (apertar um botão para fazer café), mas não precisa saber os detalhes internos de como a água é aquecida, o pó é misturado, etc. O funcionamento interno é encapsulado. Você interage com a máquina através de sua interface (os botões), não manipulando diretamente seus componentes internos.

Em Python: Convenção de Acesso

Em Python, o encapsulamento é mais uma convenção do que uma restrição rígida de acesso. Usamos prefixos em nomes de atributos para indicar que eles devem ser tratados como "privados" ou internos à classe:

  • `_atributo`: Uma única sublinhado indica que o atributo é para uso interno da classe (mas ainda acessível).
  • `__atributo`: Duplo sublinhado (conhecido como "name mangling") faz com que o Python renomeie o atributo internamente, dificultando o acesso direto de fora da classe.
class ContaBancaria:
    def __init__(self, titular, saldo_inicial):
        self.titular = titular
        self.__saldo = saldo_inicial # Atributo 'privado' por convenção

    def get_saldo(self):
        return self.__saldo

    def depositar(self, valor):
        if valor > 0:
            self.__saldo += valor
            print("Depósito realizado.")

Objetivo: Evitar Acesso Direto e Modificações Indevidas

O principal objetivo do encapsulamento é controlar como os dados internos de um objeto são acessados e modificados. Isso traz várias vantagens:

Integridade dos Dados

Ao forçar o acesso aos atributos através de métodos (chamados de "getters" e "setters"), você pode adicionar lógica de validação. Por exemplo, garantir que um saldo bancário nunca fique negativo.

Flexibilidade e Manutenção

Se a forma como um dado é armazenado internamente mudar, você só precisa atualizar o método que o manipula, sem precisar alterar todo o código que usa esse objeto.

Simplicidade na Interface

O usuário da classe não precisa saber como os detalhes internos funcionam; ele só precisa conhecer os métodos públicos que ele pode chamar.

Simulador: Encapsulamento em Ação

Explore o conceito de encapsulamento criando uma conta bancária e tentando acessar/modificar o saldo diretamente e através de métodos.

Classe `MinhaConta` (simulada)

class MinhaConta:
    def __init__(self, titular, saldo_inicial):
        self.titular = titular
        self.__saldo = saldo_inicial # Atributo 'privado'

    def get_saldo(self): # Método para obter saldo
        return self.__saldo

    def depositar(self, valor): # Método para depositar
        if valor > 0:
            self.__saldo += valor
            return f"Depósito de R${valor:.2f} realizado. Novo saldo: R${self.__saldo:.2f}"
        else:
            return "Valor de depósito inválido."

    def sacar(self, valor): # Método para sacar
        if valor > 0 and self.__saldo >= valor:
            self.__saldo -= valor
            return f"Saque de R${valor:.2f} realizado. Novo saldo: R${self.__saldo:.2f}"
        elif valor <= 0:
            return "Valor de saque inválido."
        else:
            return "Saldo insuficiente."

Interagindo com a `MinhaConta`

Conta atual: {'titular': 'Visitante', '__saldo': 100.00}