Polimorfismo em 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

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.

Deixe um comentário