Superar las limitaciones de Python con respecto a los métodos de instancia.

Parece que Python tiene algunas limitaciones con respecto a los métodos de instancia.

  1. Los métodos de instancia no pueden ser copiados.
  2. Los métodos de instancia no pueden ser decapados.

Esto es problemático para mí, porque trabajo en un proyecto muy orientado a objetos en el que hago referencia a métodos de instancia, y hay uso tanto de la copia profunda como del decapado. El decapado se realiza principalmente por el mecanismo de multiprocesamiento.

¿Cuál sería una buena manera de resolver esto? Hice una solución fea al problema de la copia, pero estoy buscando una solución mejor para ambos problemas.

¿Alguien tiene alguna sugerencia?

Actualizar:

Mi caso de uso: tengo un pequeño sistema de eventos. Cada evento tiene un atributo .action que apunta a una función que se supone que debe activar, y algunas veces esa función es un método de instancia de algún objeto.

Es posible que pueda hacer esto utilizando copy_reg.pickle . En Python 2.6:

 import copy_reg import types def reduce_method(m): return (getattr, (m.__self__, m.__func__.__name__)) copy_reg.pickle(types.MethodType, reduce_method) 

Esto no almacena el código del método, solo su nombre; pero eso funcionará correctamente en el caso común.

¡Esto hace que tanto el decapado como el copiado funcionen!

RESTO – Representación de transferencia de estado. Simplemente envía estado, no métodos.

Para transferir un objeto X de A a B, hacemos esto.

  1. Codifique el estado de X en una notación práctica y fácil de analizar. JSON es popular.

  2. A envía el texto JSON a B.

  3. B decodifica el estado de X en la notación JSON, reconstruyendo X.

B debe tener las definiciones de clase para la clase de X para que esto funcione. B debe tener todas las funciones y otras definiciones de clase de las que depende la clase de X. En resumen, tanto A como B tienen todas las definiciones. Sólo se mueve una representación del estado del objeto.

Ver cualquier artículo en REST.

http://en.wikipedia.org/wiki/Representational_State_Transfer

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

Pickle la instancia y luego acceda al método después de deshacerlo. Escoger un método de una instancia no tiene sentido porque se basa en la instancia. Si no lo hace, entonces escríbelo como una función independiente.

 import pickle class A: def f(self): print 'hi' x = A() f = open('tmp', 'w') r = pickle.dump(x, f) f.close() f = open('tmp', 'r') pickled_x = pickle.load(f) pickled_x.f()