Menu
Coddy logo textTech

Duck Typing

Parte de la sección Programación orientada a objetos del Journey de Python de Coddy. Lección 24 de 64.

La tipificación 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.

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 principal, pero ambas 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 «parecida a un pato»:

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 tipado pato 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 sigue 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 pato con diferentes objetos similares a archivos:

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

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

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 Programación orientada a objetos

Practica por tu cuenta: Compilador de Python online