Enviar um café pro programador

Mostrando postagens com marcador Polimorfismo. Mostrar todas as postagens
Mostrando postagens com marcador Polimorfismo. Mostrar todas as postagens

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!