Polimorfismo em Python

python

Polimorfismo significa “muitas formas” em grego. Ele permite que objetos diferentes respondam à mesma mensagem. Primeiramente, isso torna o código mais flexível e extensível. Por exemplo, cachorro.falar() e gato.falar() têm resultados diferentes. Além disso, você pode tratar objetos distintos de forma uniforme. Assim, a complexidade do sistema diminui significativamente. Consequentemente, a manutenção se torna muito mais fácil. Quando utilizar polimorfismo? Em sistemas que precisam de extensibilidade. Também quando você quer código que funcione com tipos futuros. Por outro lado, para scripts pequenos, polimorfismo é exagero. Python implementa polimorfismo de forma natural e flexível. Então, vamos explorar três tipos principais com exemplos práticos. Três subtítulos guiarão você pelo polimorfismo em Python. Portanto, ao final, você escreverá código mais genérico e reutilizável.

Polimorfismo por herança (subtipagem)

Classes filhas podem sobrescrever métodos da classe mãe. Uma variável do tipo mãe pode receber qualquer filha. Quando usar polimorfismo por herança? Em hierarquias claras. Por exemplo, um sistema de formas geométricas. Além disso, a herança fornece uma estrutura sólida. Exemplo de polimorfismo por herança:

O mesmo código imprimir_informacoes funciona com qualquer forma. Novas formas podem ser adicionadas sem modificar a função. Portanto, o sistema cresce sem quebrar o existente.

Polimorfismo por duck typing

Python usa tipagem pato: “se anda como pato, é um pato”. O tipo do objeto não importa, apenas seus métodos. Quando usar duck typing? Em código que prioriza flexibilidade. Por exemplo, funções que aceitam qualquer iterável. Assim, você obtém máxima reutilização de código. Exemplo de duck typing:

Duck typing é extremamente flexível e pythonico. Ele prioriza interfaces implícitas sobre herança explícita. Portanto, você escreve menos código com mais resultado.

Polimorfismo com métodos especiais

Métodos especiais (dunder) permitem polimorfismo nativo. Por exemplo, __add__ define o comportamento de +. Quando usar métodos especiais? Para tornar objetos mais naturais. Também para integrar seu código com a linguagem. Além disso, a legibilidade do código melhora muito. Exemplo de polimorfismo com métodos especiais:

Métodos especiais tornam seus objetos cidadãos de primeira classe. A fórmula do polimorfismo pode ser expressa assim: \(P = \frac{N_{\text{tipos suportados}}}{N_{\text{código repetido}}}\) Polimorfismo reduz drasticamente a duplicação de código. Portanto, domine essa técnica para sistemas verdadeiramente flexíveis. Seu código será mais limpo, curto e elegante. Finalmente, pratique com exemplos reais do seu dia a dia.

Herança em Python

python

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.

LinkedIn
Share
Instagram