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