Encapsulamento

encapsulamento é um dos pilares da Programação Orientada a Objetos (POO) e consiste em proteger os dados internos de um objeto, expondo apenas uma interface controlada para interação. Em Python, isso é feito usando convenções de nomenclatura e modificadores de acesso.

Como encapsular um objeto

  1. Atributos e Métodos Privados (__):

Prefixar um nome com __ (duplo underscore) torna-o privado, impedindo acesso direto de fora da classe.

class ContaBancaria:
    def __init__(self):
        self.__saldo = 0  # Atributo privado

Para aceder ou modificar atributos privados, usam-se métodos públicos (getters/setters).

2. Atributos Protegidos (_):

Prefixo _ (single underscore) indica que o atributo é protegido ou protected (convenção, não imposição).

self._senha = "1234"  # Atributo protegido (evitar acesso externo)

3. Propriedades (@property):

Permitem criar getters/setters de forma elegante, mantendo a sintaxe de atributo.

@property
def saldo(self):
    return self.__saldo

@saldo.setter
def saldo(self, valor):
    if valor >= 0:
        self.__saldo = valor

Exemplo:

class Pessoa:
    def __init__(self, nome, idade):
        self.__nome = nome  # Privado
        self._idade = idade  # Protegido

    # Getter para nome (acesso controlado)
    @property
    def nome(self):
        return self.__nome

    # Setter para idade (validação)
    @property
    def idade(self):
        return self._idade

    @idade.setter
    def idade(self, nova_idade):
        if nova_idade > 0:
            self._idade = nova_idade

# Uso
p = Pessoa("João", 30)
print(p.nome)       # Saída: "João" (via getter)
p.idade = 35        # Altera idade (via setter)
print(p.idade)      # Saída: 35