Menu
CoddyTech

Tipado pato

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 ambos tienen los métodos swim() y quack().

Crea una función que funcione con cualquier objeto «similar a un 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 necesarios.

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: la tipificación por 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 siga el principio de que «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: Importa la clase TextFile desde textfile.py
# TODO: Importa la clase Database desde database.py
# TODO: Importa la clase NetworkResource desde networkresource.py

def process_data(data_source, data):
    # TODO: Llama al método read() de data_source e imprime el resultado
    # TODO: Llama al método write(data) de data_source e imprime el resultado
    pass


# Prueba con diferentes fuentes de datos - NO MODIFIQUES ESTE CÓDIGO DE PRUEBA
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