Duck typing

Su nombre viene de la frase «Si se ve como pato y suena como pato, entonces es un pato».

Y se basa en la premisa de que un objeto no tiene porque soportar todos los métodos y propiedades una clase o interfaz especifica para poder ser pasado como argumento de un método. El objeto solo tiene que soportar aquellos métodos y propiedades que sean necesarios por el método.

Algunas características de C# han soportado duck typing desde hace tiempo, como es el caso del operador foreach, ya que solo se necesita que el objeto tenga implementado un método publico llamado GetEnumerator, el cual no reciba argumentos y retorne un tipo que tenga dos cosas, un método llamado MoveNext que no reciba argumentos y regrese un tipo Boolean y una propiedad Current que regrese un objeto.

Para el caso de C#, el chequeo de tipo de clases se realiza en tiempo de ejecución en lugar de compilación, esto permite gozar de sus beneficios con una penalización en el tiempo de compilación. Por otra parte Python determina el tipo de un objeto mediante la inspección de sus métodos o conjunto de atributos.

class Persona:
    def hablar(self):
        print("Hola!")

class Pato:
    def hablar(self):
        print("Quaaaaaack!")

class AlguienMas:
    pass

def EnElBosque(cosa):
    cosa.hablar()

donald = Pato()
john = Persona()
who = AlguienMas()

for cosa in [donald, john, who]:
    try:
        EnElBosque(cosa)
    except AttributeError:
        print 'Meeowww!'

Para duck typing se prefiere el estilo de programación en el que «Es mas fácil pedir perdón que pedir permiso», por lo que se intenta ejecutar algún método o leer una propiedad y si no funciona se tiene un comportamiento alternativo.