Herança em Python

python
0 – Python
5 – Orientada a Objetos (POO)
5.1 – Classes e objetos
5.2 – Herança (simples e múltipla)
5.3 – Polimorfismo
5.4 – Encapsulamento (público, _protegido, __privado)
5.5 – Métodos mágicos (__init__, __call__, __add__, etc.)
5.6 – Propriedades (@property, setter, deleter)
5.7 – Classes abstratas (ABC, abstractmethod)
5.8 – Metaclasses (type, __new__)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Herança permite criar uma nova classe a partir de uma existente. A classe filha herda atributos e métodos da classe mãe. Primeiramente, isso promove reutilização de código e hierarquias. Por exemplo, Caminhao e Moto herdam de Veiculo. Além disso, a classe filha pode sobrescrever ou adicionar novos métodos. A voz passiva é usada aqui: “os métodos são herdados automaticamente”. Quando utilizar herança? Quando há uma relação “é um” entre conceitos. Por exemplo, “Gato é um Animal” e “Cachorro é um Animal”. Python suporta herança simples (uma mãe) e múltipla (várias mães). Vamos explorar ambos os tipos com exemplos práticos. Três subtítulos guiarão você pelo universo da herança. Ao final, você dominará hierarquias de classes em Python.

Herança simples: estendendo classes

Herança simples envolve apenas uma classe mãe. Use class Filha(Mae): para declarar herança. O método super() chama o construtor da classe mãe. Quando usar herança simples? Em hierarquias lineares claras. Por exemplo, sistemas de funcionários ou formas geométricas. A voz passiva é aplicada: “os atributos são inicializados pela mãe”. Exemplo de herança simples:

A classe filha herda tudo que não foi sobrescrito. super() é essencial para inicializar corretamente a mãe.

Herança múltipla: combinando comportamentos

Herança múltipla permite uma classe herdar de várias mães. Use class Filha(Mae1, Mae2): para declarar. Python usa o MRO (Method Resolution Order) para resolver conflitos. Quando usar herança múltipla? Em mixins e interfaces. Por exemplo, combinando comportamentos como “Voador” e “Nadador”. A voz passiva é aplicada: “as classes são pesquisadas em ordem específica”. Exemplo de herança múltipla:

Herança múltipla é poderosa, mas use com moderação. Mixins são classes pequenas que adicionam comportamentos específicos.

Sobrescrita e super() em herança múltipla

super() funciona de forma especial em herança múltipla. Ele segue o MRO para chamar o próximo método na hierarquia. Isso permite que todos os pais sejam inicializados corretamente. Quando usar super()? Em praticamente todos os construtores. Também em métodos que querem estender (não substituir) o comportamento. A voz passiva é aplicada: “as chamadas são delegadas ao próximo na MRO”. Exemplo de super() em herança múltipla:

A fórmula do MRO para herança múltipla: \(\text{MRO}(C(B_1, B_2, …, B_n)) = [C] + \text{merge}(\text{MRO}(B_1), …, \text{MRO}(B_n), [B_1, …, B_n])\) Herança é uma ferramenta poderosa quando usada com sabedoria. Prefira composição sobre herança em casos duvidosos. Use herança para relações “é um” genuínas. Seu código será mais limpo e manutenível.

Classes e Objetos em Python

python
0 – Python
5 – Orientada a Objetos (POO)
5.1 – Classes e objetos
5.2 – Herança (simples e múltipla)
5.3 – Polimorfismo
5.4 – Encapsulamento (público, _protegido, __privado)
5.5 – Métodos mágicos (__init__, __call__, __add__, etc.)
5.6 – Propriedades (@property, setter, deleter)
5.7 – Classes abstratas (ABC, abstractmethod)
5.8 – Metaclasses (type, __new__)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Classes são plantas arquitetônicas para criar objetos. Objetos são instâncias concretas que ocupam memória. Primeiramente, uma classe define atributos (dados) e métodos (comportamentos). Por exemplo, uma classe Cachorro pode ter nome e latir(). Além disso, cada objeto tem seus próprios valores de atributos. A voz passiva é usada aqui: “os objetos são criados a partir da classe”. Quando utilizar classes e objetos? Em sistemas complexos e reutilizáveis. Também quando você precisa modelar entidades do mundo real. Python é uma linguagem orientada a objetos desde o início. Vamos explorar sintaxe, construtores e encapsulamento. Três subtítulos guiarão você pelos fundamentos da POO. Ao final, você criará suas próprias classes com confiança.

Sintaxe básica: criando classes e instâncias

Use a palavra-chave class seguida do nome da classe. O método __init__ é o construtor especial. Ele inicializa os atributos do novo objeto. O parâmetro self refere-se à própria instância. Quando usar classes? Sempre que você agrupar dados e comportamentos. A voz passiva é aplicada: “os atributos são definidos com self”. Exemplo de classe básica:

Cada objeto mantém seus próprios valores de atributos. Atributos de classe são compartilhados por todas as instâncias.

Encapsulamento: protegendo dados internos

Encapsulamento esconde detalhes internos da classe. Em Python, usamos convenção de nomes para indicar proteção. Um underscore _atributo significa “protegido”. Dois underscores __atributo causam name mangling. Quando usar encapsulamento? Quando um atributo não deve ser alterado diretamente. Por exemplo, um saldo bancário só muda via métodos. A voz passiva é aplicada: “as propriedades são usadas para controle de acesso”. Exemplo de encapsulamento:

Propriedades com @property permitem getters e setters elegantes. Name mangling transforma __estoque em _Produto__estoque.

Métodos especiais e boas práticas

Python oferece métodos especiais (dunder methods) para personalização. __init__ constrói, __str__ exibe, __repr__ depura. __len__ define o tamanho, __add__ sobrecarrega +. Quando usar métodos especiais? Para tornar objetos mais “pythônicos”. Por exemplo, permitir len(obj) ou obj1 + obj2. A voz passiva é aplicada: “as operações são definidas pelos métodos mágicos”. Exemplo de classe com métodos especiais:

Métodos especiais tornam suas classes mais integradas à linguagem. A fórmula da orientação a objetos é clara: \(POO = \text{classes} + \text{objetos} + \text{encapsulamento} + \text{herança}\) Classes e objetos são o alicerce de qualquer sistema Python. Comece com classes simples e adicione complexidade gradualmente. Seu código será mais organizado, reutilizável e intuitivo.