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

时间:2009-11-25 17:13:40

标签: python oop copy instance-method

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

  1. 无法复制实例方法。
  2. 无法腌制实例方法。
  3. 这对我来说是个问题,因为我在一个非常面向对象的project上工作,我在其中引用了实例方法,并且使用了深度复制和酸洗。酸洗的事情主要由多处理机制完成。

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

    有人有任何建议吗?

    更新

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

3 个答案:

答案 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,我们就这样做了。

  1. 在某些情况下编码X的状态 方便,易于解析的符号。 JSON 很受欢迎。

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

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

  4. B必须具有X类的类定义才能使用。 B必须具有X类所依赖的所有函数和其他类定义。总之,两者都是 和B有所有的定义。只有对象状态的表示才会被移动 周围。

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

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

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

答案 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()