Aplicando encapsulamento em Python

O encapsulamento é um conceito da programação orientada a objetos que consiste em esconder ou proteger certas informações ou funcionalidades de uma classe, de forma que só possam ser acessadas através de métodos ou propriedades específicas.

Em Python, o encapsulamento pode ser implementado através da utilização de convenções de nomenclatura para indicar a visibilidade de certos atributos ou métodos de uma classe. Por exemplo, um atributo ou método que começa com um sublinhado ( _ ) é considerado protegido, enquanto um que começa com dois sublinhados ( __ ) é considerado privado.

Para acessar esses atributos ou métodos protegidos ou privados, é necessário utilizar métodos públicos da classe que foram criados especificamente para esse propósito. Isso garante que a integridade da classe seja mantida e que não haja acesso indevido a informações ou funcionalidades que não deveriam ser acessadas diretamente.

Proteção de acesso

O encapsulamento é uma forma de proteger o acesso aos dados em uma classe. Em Python, isso é feito utilizando convenções de nomenclatura para indicar a visibilidade de certos atributos ou métodos de uma classe.

Um atributo ou método que começa com um sublinhado ( _ ) é considerado protegido e só deve ser acessado por métodos públicos da classe ou suas subclasses. Já um que começa com dois sublinhados ( __ ) é considerado privado e só deve ser acessado por métodos da própria classe.

Essa proteção de acesso garante que a integridade da classe seja mantida e que não haja acesso indevido a informações ou funcionalidades que não deveriam ser acessadas diretamente.

Recursos públicos e privados

Em Python, a convenção de nomenclatura para tornar um atributo ou método público é simplesmente não colocar nenhum sublinhado no início do nome. Ou seja, um atributo ou método que começa com o nome diretamente é considerado público e pode ser acessado livremente de fora da classe.

Já os atributos ou métodos protegidos ou privados só devem ser acessados por métodos públicos da própria classe, como mencionado anteriormente. Isso garante que a integridade da classe seja mantida e que não haja acesso indevido a informações ou funcionalidades que não deveriam ser acessadas diretamente.

Por exemplo, suponha que uma classe Carro tenha os seguintes atributos: marca, modelo, _ano e __numero_de_serie. O atributo marca é público, o modelo é público, mas protegido, o _ano é protegido e o __numero_de_serie é privado.

Para acessar os atributos públicos, basta utilizar a sintaxe de ponto:

class Carro:
    def __init__(self, marca, modelo, ano, numero_de_serie):
        self.marca = marca
        self._modelo = modelo
        self._ano = ano
        self.__numero_de_serie = numero_de_serie

carro = Carro("Fiat", "Uno", 2010, 123456)
print(carro.marca)  # "Fiat"
print(carro._modelo)  # "Uno"

Já para acessar os atributos protegidos e privados, é necessário utilizar métodos públicos da própria classe:

class Carro:
    def __init__(self, marca, modelo, ano, numero_de_serie):
        self.marca = marca
        self._modelo = modelo
        self._ano = ano
        self.__numero_de_serie = numero_de_serie

    def get_ano(self):
        return self._ano

    def set_ano(self, novo_ano):
        self._ano = novo_ano

carro = Carro("Fiat", "Uno", 2010, 123456)
print(carro.get_ano())  # 2010
carro.set_ano(2015)
print(carro.get_ano())  # 2015

Nesse exemplo, foi criado o método get_ano() para acessar o atributo _ano e o método set_ano() para modificá-lo. Dessa forma, é possível garantir que a integridade da classe seja mantida e que não haja acesso indevido a informações ou funcionalidades que não deveriam ser acessadas diretamente.