Encapsulamento

O encapsulamento é um dos princípios fundamentais da programação orientada a objetos (POO). Em Python, o encapsulamento permite que você restrinja o acesso a certos métodos e atributos de uma classe, tornando-os públicos, protegidos ou privados. Isso ajuda a proteger e organizar seus dados de forma eficaz. Neste tutorial, vamos explorar o encapsulamento em Python, incluindo a diferenciação entre atributos públicos, protegidos e privados, e como criar métodos getters e setters.

1. Atributos Públicos, Protegidos e Privados:

Em Python, os atributos de uma classe podem ser classificados como públicos, protegidos ou privados:

  • Atributos Públicos: São acessíveis de qualquer lugar. Não há convenção especial para atributos públicos; eles são simplesmente declarados.
class Pessoa:
    def __init__(self, nome):
        self.nome = nome  # Atributo público
  • Atributos Protegidos: São indicados por um sublinhado único no início do nome. Embora sejam acessíveis fora da classe, a convenção indica que eles não devem ser acessados diretamente.
class Pessoa:
    def __init__(self, nome):
        self._nome = nome  # Atributo protegido
  • Atributos Privados: São indicados por dois sublinhados no início do nome. Eles não devem ser acessados de fora da classe.
class Pessoa:
    def __init__(self, nome):
        self.__nome = nome  # Atributo privado

2. Métodos Getters e Setters:

Para acessar ou modificar atributos protegidos ou privados, é comum criar métodos getters e setters na classe. Um método getter permite acessar o valor de um atributo, e um método setter permite modificar o valor do atributo de maneira controlada.

class Pessoa:
    def __init__(self, nome):
        self._nome = nome  # Atributo protegido

    def get_nome(self):
        return self._nome

    def set_nome(self, novo_nome):
        if len(novo_nome) >= 2:
            self._nome = novo_nome
        else:
            print("Nome inválido.")

pessoa = Pessoa("Alice")
print(pessoa.get_nome())  # Saída: Alice
pessoa.set_nome("B")  # Saída: Nome inválido.

3. Propriedades em Python:

Em Python, você pode usar o decorador @property para criar propriedades, que são métodos de acesso para atributos. Isso permite que você acesse um atributo como se fosse uma variável, em vez de chamar um método.

class Pessoa:
    def __init__(self, nome):
        self._nome = nome

    @property
    def nome(self):
        return self._nome

    @nome.setter
    def nome(self, novo_nome):
        if len(novo_nome) >= 2:
            self._nome = novo_nome
        else:
            print("Nome inválido.")

pessoa = Pessoa("Alice")
print(pessoa.nome)  # Saída: Alice
pessoa.nome = "Bob"
print(pessoa.nome)  # Saída: Bob

O encapsulamento em Python é uma técnica importante para proteger e organizar seus dados em classes. Compreender a diferenciação entre atributos públicos, protegidos e privados, bem como a criação de métodos getters e setters, é fundamental para a prática da programação orientada a objetos em Python.