Vincular dinámicamente los métodos de Python a una instancia vincula correctamente los nombres de los métodos, pero no el método

Estoy escribiendo un cliente para un grupo de servicios REST. El cuerpo de las llamadas REST tiene la misma estructura XML, dados los parámetros. Hay varias docenas de llamadas, y no las implementaré todas. Como tal, quiero que sean fáciles de especificar y usar. Los métodos REST se agrupan por funcionalidad en módulos separados y deberán compartir el mismo abridor urllib2 para la autenticación y las cookies. Aquí hay un ejemplo de cómo se declara un método:

@rest_method('POST', '/document')
def createDocument(id, title, body):
    # possibly some validation on the arguments
    pass

Todo lo que el desarrollador tiene que preocuparse es la validación. El formato del XML (para POST y PUT) o la URL (para GET y DELETE) y la deserialización de la respuesta se realiza en métodos de ayuda. Los métodos decorados se recogen en un objeto cliente desde el que se ejecutarán y procesarán. Por ejemplo:

c = RESTClient('http://foo.com', username, password)
c.createDocument(1, 'title', 'body')

El código está hecho. El único problema es adjuntar los métodos decorados a la clase cliente. Aunque todos los métodos decorados se pueden ver en la instancia del cliente, todos comparten la misma definición, es decir, la última que debe vincularse. Aquí hay un breve ejemplo que duplica el comportamiento que estoy viendo:

import types

class C(object): pass
def one(a): return a
def two(a, b): return a+b
def bracketit(t): return '(%s)' % t

c = C()

for m in (one, two):
    new_method = lambda self, *args, **kwargs:\
            bracketit(m(*args, **kwargs))
    method = types.MethodType(new_method, c, C)
    setattr(C, m.__name__, method)

print c.one 
print c.two
print c.two(1, 2)
print c.one(1)

Cuando ejecuto esto, obtengo el siguiente resultado:

<bound method C.<lambda> of <__main__.C object at 0x1003b0d90>>
<bound method C.<lambda> of <__main__.C object at 0x1003b0d90>>
(3)
Traceback (most recent call last):
  File "/tmp/test.py", line 19, in <module>
    print c.one(1)
  File "/tmp/test.py", line 12, in <lambda>
    bracketit(m(*args, **kwargs))
TypeError: two() takes exactly 2 arguments (1 given)

No estoy seguro de por qué los dos métodos están vinculados de la misma manera. No he podido encontrar mucha documentación sobre cómo el método vincula los métodos a las instancias. ¿Qué sucede debajo del capó y cómo puedo corregir el código anterior para que se imprima la segunda llamada '(1)'?

Respuestas a la pregunta(2)

Su respuesta a la pregunta