Polimorfismo é um conceito chave na programação orientada a objetos (POO) que permite que objetos de diferentes classes sejam tratados de maneira uniforme. Em Python 3, uma linguagem de programação de alto nível conhecida por sua simplicidade e flexibilidade, o polimorfismo pode ser aplicado de várias maneiras.
Uma das formas mais comuns de aplicar o polimorfismo em Python 3 é através de métodos de classes. Quando diferentes classes têm métodos com o mesmo nome, mas comportamentos diferentes, isso possibilita o uso desses métodos de forma polimórfica.
Por exemplo, considere duas classes, Cachorro e Gato, ambas com um método chamado fazer_som() que representa o som que cada animal faz:
pythonclass Cachorro:
def fazer_som(self):
return "Au au!"
class Gato:
def fazer_som(self):
return "Miau!"
Agora, podemos criar uma função que aceita objetos de qualquer uma dessas classes e chama o método fazer_som() em cada um deles, sem precisar saber explicitamente de que tipo de animal se trata:
pythondef fazer_barulho(animal):
print(animal.fazer_som())
# Criando instâncias de cada classe
rex = Cachorro()
whiskers = Gato()
# Chamando a função com objetos de diferentes classes
fazer_barulho(rex) # Saída: Au au!
fazer_barulho(whiskers) # Saída: Miau!
Neste exemplo, a função fazer_barulho() pode lidar com objetos de diferentes classes (Cachorro e Gato) de forma polimórfica, pois ambos os objetos têm um método fazer_som() que pode ser chamado da mesma maneira.
Outra maneira de aplicar o polimorfismo em Python 3 é através de herança e substituição de métodos. Quando uma classe filha substitui um método de sua classe pai por uma implementação própria, isso permite que objetos dessa classe filha sejam usados de forma polimórfica, mantendo a mesma interface da classe pai.
Vamos expandir o exemplo anterior adicionando uma classe pai chamada Animal, da qual Cachorro e Gato herdam:
pythonclass Animal:
def fazer_som(self):
pass # Este método será substituído nas subclasses
class Cachorro(Animal):
def fazer_som(self):
return "Au au!"
class Gato(Animal):
def fazer_som(self):
return "Miau!"
Agora, mesmo que a classe Animal tenha um método fazer_som() que não faz nada, as classes Cachorro e Gato substituem esse método com suas próprias implementações. Podemos usar o polimorfismo da mesma maneira que antes:
python# Criando instâncias de cada classe
rex = Cachorro()
whiskers = Gato()
# Chamando a função com objetos de diferentes classes
fazer_barulho(rex) # Saída: Au au!
fazer_barulho(whiskers) # Saída: Miau!
Assim, mesmo que Animal tenha um método fazer_som() que não faz nada, podemos usar polimorfismo em Python 3 para chamar métodos diferentes em objetos de diferentes classes de forma uniforme.
Além disso, o polimorfismo também pode ser aplicado em Python 3 usando funções que aceitam argumentos de tipos diferentes e executam operações com base nos tipos desses argumentos. Por exemplo, consideremos uma função soma() que pode somar números ou concatenar strings, dependendo dos tipos dos argumentos fornecidos:
pythondef soma(a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a + b
elif isinstance(a, str) and isinstance(b, str):
return a + b
else:
raise TypeError("Tipos de argumentos não suportados para soma")
# Chamando a função com diferentes tipos de argumentos
print(soma(5, 3)) # Saída: 8
print(soma(2.5, 4.5)) # Saída: 7.0
print(soma("Olá, ", "mundo!")) # Saída: Olá, mundo!
Neste exemplo, a função soma() aceita argumentos de diferentes tipos (inteiros, flutuantes e strings) e executa a operação apropriada com base nos tipos dos argumentos fornecidos.
Portanto, em Python 3, o polimorfismo pode ser aplicado de várias maneiras, incluindo o uso de métodos de classes com o mesmo nome, herança e substituição de métodos, e funções que aceitam argumentos de tipos diferentes e executam operações com base nesses tipos. Isso proporciona flexibilidade e simplicidade no design e na implementação de programas orientados a objetos.
“Mais Informações”

O conceito de polimorfismo, ou “polymorphism” em inglês, é fundamental na programação orientada a objetos (POO). Em Python 3, uma linguagem de programação de alto nível e orientada a objetos, o polimorfismo pode ser aplicado de várias maneiras para aumentar a flexibilidade e a modularidade do código.
Em termos simples, o polimorfismo permite que objetos de diferentes classes sejam tratados de maneira uniforme, ou seja, é a capacidade de um único nome (como um método ou função) para representar diferentes tipos de dados ou comportamentos.
Existem duas formas principais de polimorfismo em Python: o polimorfismo de sobrecarga e o polimorfismo de subtipo (também conhecido como “duck typing”).
- Polimorfismo de Sobrecarga:
O polimorfismo de sobrecarga permite que diferentes classes compartilhem o mesmo nome de método, mas com comportamentos diferentes. Isso é alcançado através do mecanismo de sobrecarga de operadores. Por exemplo, considerando duas classes diferentes, podemos sobrecarregar o operador de adição (+) de forma que ele realize operações distintas dependendo dos tipos de dados envolvidos.
pythonclass Circulo:
def __init__(self, raio):
self.raio = raio
def area(self):
return 3.14 * self.raio ** 2
class Retangulo:
def __init__(self, largura, altura):
self.largura = largura
self.altura = altura
def area(self):
return self.largura * self.altura
# Usando polimorfismo de sobrecarga
circulo = Circulo(5)
retangulo = Retangulo(4, 6)
print("Área do círculo:", circulo.area()) # Saída: Área do círculo: 78.5
print("Área do retângulo:", retangulo.area()) # Saída: Área do retângulo: 24
Ambas as classes Circulo e Retangulo têm um método area(), mas cada um deles calcula a área de forma diferente. Isso demonstra o polimorfismo de sobrecarga em ação.
- Polimorfismo de Subtipo (Duck Typing):
Em Python, o polimorfismo de subtipo é baseado no princípio “se parece com um pato, nada como um pato, então deve ser um pato”. Isso significa que não importa qual é a classe do objeto, contanto que ele tenha os métodos necessários, ele pode ser tratado da mesma maneira.
pythonclass Pato:
def quack(self):
return "Quack! Quack!"
class Pessoa:
def quack(self):
return "A pessoa imita um pato: Quack! Quack!"
# Função que aceita qualquer objeto que tenha um método quack()
def imitar_quack(objeto):
return objeto.quack()
pato = Pato()
pessoa = Pessoa()
print(imitar_quack(pato)) # Saída: Quack! Quack!
print(imitar_quack(pessoa)) # Saída: A pessoa imita um pato: Quack! Quack!
Neste exemplo, tanto a classe Pato quanto a classe Pessoa têm um método quack(). Mesmo que as classes sejam diferentes, o polimorfismo de subtipo permite que tratemos ambas da mesma forma.
O polimorfismo é uma ferramenta poderosa na programação orientada a objetos, pois permite escrever código mais genérico e flexível, tornando-o mais fácil de manter e estender. Em Python, a flexibilidade da linguagem permite a implementação fácil e natural do polimorfismo, tanto através de sobrecarga de operadores quanto do princípio de duck typing. Dominar o polimorfismo é essencial para escrever código Python eficiente e elegante.

