8

Python 似乎对实例方法有一些限制。

  1. 无法复制实例方法。
  2. 实例方法不能被腌制。

这对我来说是个问题,因为我从事一个非常面向对象的项目,在该项目中我引用了实例方法,并且同时使用了 deepcopying 和 pickling。酸洗的事情主要是由多处理机制完成的。

什么是解决这个问题的好方法?我对复制问题做了一些丑陋的解决方法,但我正在寻找一个更好的解决方案来解决这两个问题。

有没有人有什么建议?

更新:

我的用例:我有一个很小的事件系统。每个事件都有一个.action属性指向它应该触发的函数,有时该函数是某个对象的实例方法。

4

3 回答 3

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)

这不存储方法的代码,只存储它的名称;但这在常见情况下可以正常工作。

这使得酸洗和复制都有效!

于 2009-11-25T18:08:59.280 回答
3

REST - 表示状态转移。只发送状态,而不是方法。

要将对象 X 从 A 转移到 B,我们这样做。

  1. A 用一些方便、易于解析的符号对 X 的状态进行编码。JSON很流行。

  2. A 将 JSON 文本发送给 B。

  3. B 从 JSON 符号中解码 X 的状态,重构 X。

B 必须具有 X 的类的类定义才能工作。B 必须具有 X 的类所依赖的所有函数和其他类定义。简而言之,A 和 B 都有所有定义。只有对象状态的表示被移动。

请参阅任何有关 REST 的文章。

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

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

于 2009-11-25T17:36:35.440 回答
-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()
于 2009-11-25T17:40:29.970 回答