Polimorfismo de programación orientada a objetos de Python: interfaces y tipos de pato

Domina el polimorfismo en Python. Aprenda a escribir código flexible y poco acoplado utilizando tipificación pato, anulación de métodos y clases base abstractas.

Pruébelo en el editor

Descripción general

Polimorfismo es un término griego que significa "muchas formas". En programación orientada a objetos, se refiere a la capacidad de diferentes clases de responder a la misma llamada de método de una manera única. El polimorfismo le permite escribir una única función que puede procesar muchos tipos diferentes de objetos, siempre que compartan una interfaz común. Esto permite un bajo acoplamiento y hace que sus sistemas de software sean altamente adaptables y fáciles de ampliar.

En Python, el polimorfismo está profundamente ligado a un concepto conocido como Duck Typing. El término proviene de la frase: "Si camina como un pato y grazna como un pato, entonces debe ser un pato". En Python de tipo dinámico, a una función no le importa a qué clase pertenece un objeto; solo le importa si ese objeto implementa los métodos solicitados. Por ejemplo, si tiene una función que llama a `.speak()`, puede pasarle un perro, un gato o un robot; siempre que todos tengan un método `.speak()`, el código se ejecuta perfectamente.

Para arquitecturas más estrictas, Python proporciona clases base abstractas (ABC) a través del módulo incorporado `abc`. Al heredar de `abc.ABC` y usar el decorador `@abstractmethod`, puedes definir interfaces formales que las clases secundarias están obligadas a implementar. Si una clase secundaria no puede definir los métodos abstractos, Python generará un TypeError cuando intente crear una instancia. Equilibrar la escritura flexible con clases abstractas formales es una habilidad clave para diseñar bibliotecas Python resistentes.

Código y salida de ejecución

Implementar clases polimórficas que representan formas que calculan su área.

polymorphism_demo.py
Pruébelo en el 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))
Salida terminal
Calculated Area: 16.00
Calculated Area: 28.27

Implementación paso a paso

  • Escribir procesadores de pagos que manejan objetos CreditCard, PayPal y Stripe
  • Dibujar varios elementos (texto, imagen) usando un bucle de renderizado unificado
  • Burlarse de conexiones API externas durante las pruebas unitarias

Preguntas frecuentes

¿Qué es la mecanografía de pato?

Es el enfoque dinámico de Python al polimorfismo. Comprueba la presencia de métodos y propiedades en tiempo de ejecución en lugar de verificar la herencia de una clase principal específica.

¿Puedes crear una instancia de una clase base abstracta?

No. Intentar crear una instancia de una clase que hereda de ABC y contiene métodos abstractos generará un TypeError.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.