繁体   English   中英

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

[英]Overcoming Python's limitations regarding instance methods

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

  1. 无法复制实例方法。
  2. 实例方法无法进行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,我们这样做。

  1. A以一些方便易用的解析符号对X的状态进行编码。 JSON很受欢迎。

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

  3. B解码X形式JSON表示法的状态,重构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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM