克服Python关于实例方法的限制

似乎Python对实例方法有一些限制。 无法复制实例方法。 实例方法无法进行pickle。 这对我来说是有问题的,因为我在一个非常面向对象的项目中工作,我在其中引用实例方法,并且使用了深度复制和酸洗。酸洗的事情主要由多处理机制完成。 什么是解决这个问题的好方法?我对复制问题做了一些丑陋的解决方法,但是 我正在寻找一个更好的解决方案来解决这两个问题。 有没有人有什么建议? 更新: 我的用例:我有一个很小的事件系统。每个事件都有一个
.action
属性,指向它应该触发的函数,有时该函数是某个对象的实例方法。     
已邀请:
您可以使用
copy_reg.pickle
执行此操作。在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)
这不存储方法的代码,只是它的名称;但这在普通情况下会正常工作。 这使得酸洗和复印都有效!     
REST - 表示状态转移。只是发送状态,而不是方法。 要将对象X从A传输到B,我们这样做。 A在某些情况下编码X的状态 方便,易于解析的符号。 JSON 很受欢迎。 A将JSON文本发送给B. B解码X形式JSON的状态 符号,重建X. B必须具有X类的类定义才能工作。 B必须具有X类所依赖的所有函数和其他类定义。总之,两者都是 和B有所有的定义。只有对象状态的表示才会被移动 周围。 查看有关REST的任何文章。 http://en.wikipedia.org/wiki/Representational_State_Transfer http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm     
pickle实例然后取消它后访问该方法。挑选实例的方法没有意义,因为它依赖于实例。如果没有,则将其写为独立函数。
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()
    

要回复问题请先登录注册