O que é Polimorfismo e Como Ele Promove a Reutilização de Código?

Polimorfismo é o próximo conceito chave da programação orientada a objetos (OOP) sobre o qual falaremos. Com polimorfismo, você tem acesso a uma interface onde pode interagir com muitos objetos do mesmo tipo. Vamos dar uma olhada mais profunda no polimorfismo e como ele permite que você reutilize código. O polimorfismo permite que métodos em diferentes classes compartilhem o mesmo nome mas executem tarefas diferentes. Você chama o mesmo nome de método em objetos diferentes e cada um responde de sua própria maneira. Aqui está o exemplo básico de polimorfismo:
class A:
   def action(self): ...

class B:
   def action(self): ...

class C:
   def action(self): ...

Class().method()  # Works for A, B, or C
Aqui está um exemplo usando diferentes sons de animais para representar polimorfismo:
class Cat:
   def speak(self):
       return "A cat meow"

class Bird:
   def speak(self):
       return "A bird tweet"
  
class Monkey:
   def speak(self):
       return "A monkey ooh ooh aah aah ooh ooh aah aah"

def animal_sound(animal):
   print(animal.speak())

animal_sound(Cat())
animal_sound(Bird())
animal_sound(Monkey())
Neste exemplo, animal_sound() é uma função que recebe qualquer objeto com um método speak().  Quando você passa um Cat, Bird e Monkey, ele chama o método speak() do objeto e imprime o resultado. Como cada classe define speak() de forma diferente, você obtém saídas diferentes da mesma função. Isso é polimorfismo em ação. Aqui está outro exemplo, desta vez com instâncias e um atributo:
class Twitter:
   def __init__(self, content):
       self.content = content

   def post(self):
       return f"🐦 Tweet: '{self.content}' (280 chars max)"

class Instagram:
   def __init__(self, content):
       self.content = content

   def post(self):
       return f"📸 Instagram Post: '{self.content}' + ✨ filters"

class LinkedIn:
   def __init__(self, content):
       self.content = content

   def post(self):
       return f"💼 LinkedIn Article: '{self.content}' (Professional Mode)"

def start(social_media):
   print(social_media.post())  # Calls .post() on any object

# Instances
tweet = Twitter('Just learned Python polymorphism!')
photo = Instagram('Sunset vibes 🌅')
article = LinkedIn('Why OOP matters in 2024')

# The polymorphic calls - same function, different outputs
start(tweet) # 🐦 Tweet: 'Just learned Python polymorphism!' (280 chars max)
start(photo) # 📸 Instagram Post: 'Sunset vibes 🌅' + ✨ filters
start(article) # 💼 LinkedIn Article: 'Why OOP matters in 2024' (Professional Mode)
Também existe um tipo de polimorfismo chamado inheritance-based polymorphism. No polimorfismo baseado em herança, uma classe pai define um método e múltiplas classes filhas sobrescrevem esse método à sua maneira. Você pode então chamar o mesmo método em qualquer objeto filho e ele se comporta de forma diferente dependendo de qual classe filha ele é. Aqui está um exemplo:
class Animal:
   def speak(self):
       return 'Some generic sound'

class Cat(Animal):
   def speak(self):
       return 'A cat meow'

class Dog(Animal):
   def speak(self):
       return 'A dog barks woof woof'

class Monkey(Animal):
   def speak(self):
       return 'A monkey ooh ooh aah aah ooh ooh aah aah'
  
print(Cat().speak()) # A cat meow
print(Dog().speak()) # A dog barks woof woof
print(Monkey().speak()) # A monkey ooh ooh aah aah ooh ooh aah aah
print(Animal().speak()) # Some generic sound
Você pode ver que cada classe filha da classe pai Animal sobrescreve o método speak() para fornecer sua própria implementação. Então, quando você chama o método speak() em uma instância de cada subclasse, ele retorna o som específico associado a esse animal. Você também pode ir além e fazer a chamada em uma lista, depois percorrer a lista para exibir o que o método speak() retorna para cada um:
animals = [Cat(), Dog(), Monkey()]

for animal in animals:
   print(animal.speak())

# Output:
# A cat meow
# A dog barks woof woof
# A monkey ooh ooh aah aah ooh ooh aah aah
Este módulo não possui perguntas. Marque como concluído.