Polimorfismo Python OOP: digitação e interfaces de pato

Domine o polimorfismo em Python. Aprenda como escrever código flexível e fracamente acoplado usando digitação duck, substituição de método e classes base abstratas.

Experimente no Editor

Visão geral

Polimorfismo é um termo grego que significa "muitas formas". Na Programação Orientada a Objetos, refere-se à capacidade de diferentes classes responderem à mesma chamada de método de sua maneira única. O polimorfismo permite escrever uma única função que pode processar muitos tipos diferentes de objetos, desde que compartilhem uma interface comum. Isso permite baixo acoplamento e torna seus sistemas de software altamente adaptáveis ​​e fáceis de estender.

Em Python, o polimorfismo está profundamente ligado a um conceito conhecido como Duck Typing. O termo vem da frase: “Se anda como um pato e grasna como um pato, então deve ser um pato”. No Python de tipo dinâmico, uma função não se importa a qual classe um objeto pertence; ele só se importa se esse objeto implementa os métodos solicitados. Por exemplo, se você tem uma função que chama `.speak()`, você pode passar para ela um Cachorro, um Gato ou um Robô – desde que todos tenham um método `.speak()`, o código funciona perfeitamente.

Para arquiteturas mais rígidas, Python fornece Classes Base Abstratas (ABCs) por meio do módulo `abc` integrado. Herdando de `abc.ABC` e usando o decorador `@abstractmethod`, você pode definir interfaces formais que as classes filhas são forçadas a implementar. Se uma classe filha falhar ao definir os métodos abstratos, o Python gerará um TypeError quando você tentar instanciá-lo. Equilibrar a digitação flexível com classes abstratas formais é uma habilidade fundamental para projetar bibliotecas Python resilientes.

Saída de código e execução

Implementação de classes polimórficas representando formas que calculam sua área.

polymorphism_demo.py
Experimente no Editor
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
Saída terminal
Calculated Area: 16.00
Calculated Area: 28.27

Implementação passo a passo

  • Escrevendo processadores de pagamento que lidam com objetos CreditCard, PayPal e Stripe
  • Desenhar vários elementos (texto, imagem) usando um loop de renderização unificado
  • Zombando de conexões de API externas durante testes de unidade

Perguntas frequentes

O que é digitação de pato?

É a abordagem dinâmica do Python para o polimorfismo. Ele verifica a presença de métodos e propriedades em tempo de execução, em vez de verificar a herança de uma classe pai específica.

Você pode instanciar uma classe base abstrata?

Não. Tentar instanciar uma classe que herda de ABC e contém métodos abstratos gerará um TypeError.

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.