Python: Encapsulamento e Herança
Última atualização: 2026-09-22
Encapsulamento esconde os detalhes internos de um objeto, expondo apenas interfaces operacionais seguras. Herança permite que uma classe tenha automaticamente a funcionalidade de outra, evitando repetição. Estes dois conceitos são a espinha dorsal da programação orientada a objetos.
1. Encapsulamento e Atributos Privados
Encapsulamento significa que os dados internos de um objeto não devem ser acessados diretamente de fora — devem ser manipulados através de métodos.
(1) Sublinhado Simples _ — Convenção para Atributos "Protegidos"
▶ Exemplo: Sublinhado Simples e Duplo
▶ ExperimenteSaída:
# Function defined successfully
Um sublinhado simples é apenas uma convenção, não imposta — Python não impede você de acessá-lo. É como escrever na documentação "isto é interno, não toque."
(2) Sublinhado Duplo __ — Name Mangling
▶ Exemplo: Classe Conta Bancária
▶ ExperimenteSaída:
# Function defined successfully
Sublinhados duplos acionam name mangling — __saldo é internamente transformado para _ContaBancaria__saldo. Isso não é "privacidade" verdadeira, apenas torna menos provável a sobrescrita acidental.
private verdadeira; Python não tem e não planeja adicionar uma.
▶ Exemplo: Classe Temperatura (Dificuldade ⭐⭐)
▶ ExperimenteSaída:
Temperatura não pode ser abaixo do zero absoluto!
2. @property: Controle Elegante de Acesso
Escrever set_celsius() / get_celsius() é verboso. @property permite controlar o acesso mantendo a sintaxe de acesso a atributos:
▶ Exemplo: Usando @property
▶ ExperimenteSaída:
# Function defined successfully
@property: 1) Sem parênteses para acesso: t.celsius em vez de t.get_celsius(). 2) Validação automática na atribuição: t.celsius = value em vez de t.set_celsius(value). 3) Pode converter um atributo regular em um computado sem quebrar código existente.
3. Herança
Herança permite que uma classe filha tenha todos os atributos e métodos de sua classe pai:
▶ Exemplo: Herança Animal
▶ ExperimenteSaída:
# Function defined successfully
(1) super(): Chamando Métodos do Pai
▶ Exemplo: super() para Chamar o Pai
▶ ExperimenteSaída:
# Function defined successfully
4. Padrão Mixin
Um Mixin é uma classe especial — não usada independentemente, mas "misturada" para adicionar funcionalidade a outras classes:
▶ Exemplo: Padrão Mixin
▶ ExperimenteSaída:
# Function defined successfully
Mixin indicam que são para misturar, não para uso independente. Uma classe pode misturar múltiplos Mixins mais uma classe base principal — muito mais flexível que herança única profunda.
5. Casos de Uso Comuns
- Validação de dados: Use
@property.setterpara garantir validade dos dados na atribuição. - Propriedades somente leitura: Use
@propertysem setter para atributos somente leitura. - Reutilização de código: Coloque funcionalidade comum na classe base; subclasses escrevem apenas as diferenças.
- Composição funcional: Use Mixins para adicionar recursos flexivelmente a diferentes classes.
❓ Perguntas Frequentes
@property e um método regular?@property faz um método parecer um atributo — sem parênteses para acesso, atribuição aciona o setter. É essencialmente um "interceptador de atributos" — você escreve código como se estivesse manipulando um atributo, mas um método realmente executa.class C(A, B). No entanto, herança múltipla tem o "problema do diamante" (qual método do pai usar quando ambos têm o mesmo nome). Python usa MRO (Method Resolution Order), pesquisando da esquerda para a direita. Mixins são um padrão de design que aproveita a herança múltipla, com classes Mixin sendo pequenas e funcionalmente independentes, evitando problemas de diamante.📖 Resumo
- Encapsulamento:
_significa "não toque";__aciona name mangling;@propertyfornece controle elegante de acesso - Herança: classes filhas têm automaticamente atributos e métodos do pai;
super()chama métodos do pai - Sobrescrita de método: classe filha redefine um método com o mesmo nome do pai
- Mixin: use herança múltipla para adicionar funcionalidade flexivelmente; preferível a herança profunda
- Python não tem atributos verdadeiramente privados — baseia-se em convenção e name mangling
📝 Exercícios
-
Iniciante (Dificuldade ⭐): Defina uma classe
Produtocom@propertypara o atributopreco— deve ser positivo ao definir; retorna o valor original ao obter. -
Intermediário (Dificuldade ⭐⭐): Defina uma herança de três níveis:
Animal->Mamifero->Cachorro/Gato.Animaltemnomeeidade;Mamiferoadicionacor_pelo;CachorroeGatoimplementam seus próprios métodosfalar(). -
Avançado (Dificuldade ⭐⭐⭐): Crie um sistema de logging com
MixinLogavel(fornece métodoslog_info(),log_error()) e uma classe baseAplicacao(tem um atributonome). FaçaWebAppeCLIAppherdarem deAplicacaoe misturaremMixinLogavelpara implementar funcionalidade de logging.