Menu
Coddy logo textTech

Duck Typing

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 24 de 64.

El tipado de pato (duck typing) se enfoca en lo que un objeto puede hacer, no en lo que es. Si un objeto tiene los métodos que necesitas, puedes usarlo, independientemente de su tipo de clase.

Aquí hay dos clases no relacionadas con los mismos métodos:

class Duck:
    def swim(self):
        return "Duck swimming"
    
    def quack(self):
        return "Quack!"

class Person:
    def swim(self):
        return "Person swimming"
    
    def quack(self):
        return "Person imitating a duck: Quack!"

Observa que Duck y Person no heredan de la misma clase padre, pero ambos tienen los métodos swim() y quack().

Crea una función que funcione con cualquier objeto "tipo pato":

def make_it_swim_and_quack(duck_like_object):
    print(duck_like_object.swim())
    print(duck_like_object.quack())

A esta función no le importa el tipo del objeto; solo le importa que el objeto tenga los métodos requeridos.

Usa la función con ambas clases:

make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())

Salida:

Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!

Añade otra clase de tipo "pato" (duck-like):

class Robot:
    def swim(self):
        return "Robot swimming with propellers"
    
    def quack(self):
        return "Robot sound: BEEP BEEP!"

make_it_swim_and_quack(Robot())

Salida:

Robot swimming with propellers
Robot sound: BEEP BEEP!

Punto clave: El duck typing permite el polimorfismo sin herencia. Si un objeto tiene los métodos que necesitas, puedes usarlo. Esto hace que el código Python sea flexible y siga el principio "es más fácil pedir perdón que permiso".

challenge icon

Desafío

Intermedio

En este desafío, implementarás un sistema que demuestra el tipado de pato (duck typing) con diferentes objetos de tipo archivo:

  • textfile.py: Implementa la clase TextFile con los métodos read() y write(data)
  • database.py: Implementa la clase Database con firmas de método coincidentes
  • networkresource.py: Implementa la clase NetworkResource con firmas de método coincidentes
  • driver.py - Implementa casos de prueba que verificarán que tu implementación funcione correctamente

Cada archivo contiene comentarios TODO detallados que guían tu implementación.

Hoja de referencia

El duck typing (tipado de pato) se centra en lo que un objeto puede hacer, no en lo que es. Si un objeto tiene los métodos que necesitas, puedes usarlo independientemente de su tipo de clase.

Ejemplo de duck typing con clases no relacionadas que comparten los mismos métodos:

class Duck:
    def swim(self):
        return "Duck swimming"
    
    def quack(self):
        return "Quack!"

class Person:
    def swim(self):
        return "Person swimming"
    
    def quack(self):
        return "Person imitating a duck: Quack!"

Crea una función que funcione con cualquier objeto "tipo pato":

def make_it_swim_and_quack(duck_like_object):
    print(duck_like_object.swim())
    print(duck_like_object.quack())

# Funciona con cualquier objeto que tenga los métodos swim() y quack()
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())

El duck typing permite el polimorfismo sin herencia: si un objeto tiene los métodos que necesitas, puedes usarlo. Esto hace que el código de Python sea flexible y siga el principio "es más fácil pedir perdón que permiso".

Pruébalo tú mismo

# TODO: Importar la clase TextFile de textfile.py
# TODO: Importar la clase Database de database.py
# TODO: Importar la clase NetworkResource de networkresource.py

def process_data(data_source, data):
    # TODO: Llamar al método read() en data_source e imprimir el resultado
    # TODO: Llamar al método write(data) en data_source e imprimir el resultado
    pass


# Test with different data sources - DO NOT MODIFY THIS TEST CODE
text_file = TextFile()
database = Database()
network = NetworkResource()

print("Processing text file:")
process_data(text_file, "Hello, world!")

print("\
Processing database:")
process_data(database, "User record")

print("\
Processing network resource:")
process_data(network, "GET request")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming