Neste tutorial, aprenderemos sobre polimorfismo, diferentes tipos de polimorfismo e como podemos implementá-los em Python com a ajuda de exemplos.
O que é polimorfismo?
O significado literal de polimorfismo é a condição de ocorrência em diferentes formas.
O polimorfismo é um conceito muito importante em programação. Refere-se ao uso de uma entidade de tipo único (método, operador ou objeto) para representar diferentes tipos em diferentes cenários.
Vamos dar um exemplo:
Exemplo 1: Polimorfismo além do operador
Sabemos que o +
operador é amplamente usado em programas Python. Porém, não possui um único uso.
Para tipos de dados inteiros, o +
operador é usado para realizar a operação de adição aritmética.
num1 = 1 num2 = 2 print(num1+num2)
Conseqüentemente, o programa acima gera 3.
Da mesma forma, para tipos de dados de string, o +
operador é usado para realizar a concatenação.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
Como resultado, o programa acima gera a Programação Python.
Aqui, podemos ver que um único operador +
foi usado para realizar diferentes operações para tipos de dados distintos. Esta é uma das ocorrências mais simples de polimorfismo em Python.
Polimorfismo de função em Python
Existem algumas funções em Python que são compatíveis para serem executadas com vários tipos de dados.
Uma dessas funções é a len()
função. Ele pode ser executado com muitos tipos de dados em Python. Vejamos alguns exemplos de casos de uso da função.
Exemplo 2: função len () polimórfica
print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal")))
Resultado
9 3 2
Aqui, podemos ver que muitos tipos de dados como string, lista, tupla, conjunto e dicionário podem funcionar com a len()
função. No entanto, podemos ver que ele retorna informações específicas sobre tipos de dados específicos.

Polimorfismo de classe em Python
O polimorfismo é um conceito muito importante na Programação Orientada a Objetos.
Para saber mais sobre OOP em Python, visite: Python Object-Oriented Programming
Podemos usar o conceito de polimorfismo ao criar métodos de classe, pois o Python permite que diferentes classes tenham métodos com o mesmo nome.
Podemos então generalizar a chamada desses métodos, desconsiderando o objeto com o qual estamos trabalhando. Vejamos um exemplo:
Exemplo 3: Polimorfismo em Métodos de Classe
class Cat: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"I am a cat. My name is (self.name). I am (self.age) years old.") def make_sound(self): print("Meow") class Dog: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"I am a dog. My name is (self.name). I am (self.age) years old.") def make_sound(self): print("Bark") cat1 = Cat("Kitty", 2.5) dog1 = Dog("Fluffy", 4) for animal in (cat1, dog1): animal.make_sound() animal.info() animal.make_sound()
Resultado
Meow, eu sou um gato. Meu nome é Kitty. Eu tenho 2,5 anos. Miau Bark Eu sou um cachorro. Meu nome é Fluffy. Eu tenho 4 anos Latido
Aqui, criamos duas classes Cat
e Dog
. Eles compartilham uma estrutura semelhante e têm os mesmos nomes de método info()
e make_sound()
.
No entanto, observe que não criamos uma superclasse comum ou vinculamos as classes de forma alguma. Mesmo assim, podemos empacotar esses dois objetos diferentes em uma tupla e iterar por meio dela usando uma variável animal comum. É possível devido ao polimorfismo.
Polimorfismo e herança
Como em outras linguagens de programação, as classes filhas em Python também herdam métodos e atributos da classe pai. Podemos redefinir certos métodos e atributos especificamente para se adequar à classe filha, que é conhecida como Substituição de Método .
O polimorfismo nos permite acessar esses métodos e atributos substituídos que têm o mesmo nome da classe pai.
Vejamos um exemplo:
Exemplo 4: Substituição de Método
from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "I am a two-dimensional shape." def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Square") self.length = length def area(self): return self.length**2 def fact(self): return "Squares have each angle equal to 90 degrees." class Circle(Shape): def __init__(self, radius): super().__init__("Circle") self.radius = radius def area(self): return pi*self.radius**2 a = Square(4) b = Circle(7) print(b) print(b.fact()) print(a.fact()) print(b.area())
Resultado
Círculo Eu sou uma forma bidimensional. Os quadrados têm cada ângulo igual a 90 graus. 153,93804002589985
Aqui, podemos ver que os métodos como __str__()
, que não foram substituídos nas classes filhas, são usados na classe pai.
Devido ao polimorfismo, o interpretador Python reconhece automaticamente que o fact()
método do objeto a
(classe Square) é sobrescrito. Então, ele usa aquele definido na classe filha.
Por outro lado, como o fact()
método para o objeto b não é sobrescrito, ele é usado da classe Parent Shape.

Observação : a sobrecarga de método , uma maneira de criar vários métodos com o mesmo nome, mas com argumentos diferentes, não é possível em Python.