Enviar um café pro programador

Polimorfismo em Python

Agora que já aprendemos como usar herança, vamos aprender outro conceito importantíssimo em programação orientada a objetos, o de polimorfismo.

Polimorfismo - O que é?

Polimorfismo, em Python, é a capacidade que uma subclasse tem de ter métodos com o mesmo nome de sua superclasse, e o programa saber qual método deve ser invocado, especificamente (da super ou sub).

Ou seja, o objeto tem a capacidade de assumir diferentes formas (polimorfismo).

Vamos criar a classe Superclasse que tem apenas um método, o hello(). Instanciamos um objeto e chamamos esse método:




class Super:
 def hello(self):
  print("Olá, sou a superclasse!")

teste = Super()
teste.hello()

Agora o resultado:

  • Olá, sou a superclasse!

Agora vamos criar outra classe, a Sub,  que vai herdar a Superclasse e vamos definir nela um método de mesmo nome hello(), mas com um texto diferente:


class Super:
 def hello(self):
  print("Olá, sou a superclasse!")
  
class Sub (Super):
 def hello(self):
  print("Olá, sou a subclasse!")

teste = Sub()
teste.hello()


O resultado vai ser:
  • Olá, sou a subclasse!
Veja bem, Sub herda a Superclasse, ou seja, tudo que nem na superclasse (atributos e métodos), vai ter na subclasse.

Porém, quando chamamos o método hello(), ele vai invocar o método da subclasse e não da superclasse! O Python entende: "Opa, ele instanciou um objeto da subclasse. Por isso vou invocar o método da subclasse e não da superclasse"



Ou seja, seu objeto assumiu a forma da subclasse, embora ele também seja uma superclasse.
Dizemos que o método da subclasse fez uma sobreposição, ele sobrepôs, passou por cima, do método da superclasse.

Vamos mais além agora, e criar a Subsubclasse, que vai herdar a Sub.
Hora, se a Subsubclasse herda a Sub, e a Sub herda a Super, então a Subsubclasse também herda tudo da Super.

Porém, quando instanciamos um objeto da Subsub e invocamos o método hello(), ele vai rodar o método da Subsub:


class Super:
 def hello(self):
  print("Olá, sou a superclasse!")
  
class Sub (Super):
 def hello(self):
  print("Olá, sou a subclasse!")

class Subsub (Sub):
 def hello(self):
  print("Olá, sou a subsubclasse!")

teste = Subsub()
teste.hello()


Sacaram a lógica da coisa?
Embora estejamos chamando sempre o mesmo método (hello), que está presente em todas as classes e nas herdadas, ele age de maneira diferente!

9 comentários: