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".
Desafío
IntermedioEn 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 claseTextFilecon los métodosread()ywrite(data)database.py: Implementa la claseDatabasecon firmas de método coincidentesnetworkresource.py: Implementa la claseNetworkResourcecon firmas de método coincidentesdriver.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")Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias