En el primer artículo de La Historia de Python (en) se menciona, entre las cualidades que hacen a Python un lenguaje que permite la programación orientada a objetos, la posibilidad de “asociación de métodos en tiempo de ejecución” (”run-time binding of methods”). Hoy en otro artículo del autor, vuelvo a leer sobre el tema:

Now instances of C have a method with one argument named ‘meth’ that works exactly as before. It even works for instances of C that were created before the method was poked into the class.

Vamos a ver un ejemplo de esto:

>>> class C:
...     pass
...
>>> c1 = C()
>>> c1.hello()
Traceback (most recent call last):
  File "", line 1, in
AttributeError: C instance has no attribute 'hello'
>>> def hello(myself, name):
...     myself.lasthello = name
...     print "Hello %s" % name
...
>>> C.hello = hello
>>> c2 = C()
>>> c2.hello("mary")
Hello mary
>>> c1.hello("juanjo")
Hello juanjo