[英]Overcoming Python's limitations regarding instance methods
似乎Python对实例方法有一些限制。
这对我来说是有问题的,因为我在一个非常面向对象的项目中工作,我在其中引用实例方法,并且使用了深度复制和酸洗。 酸洗的事情主要由多处理机制完成。
什么是解决这个问题的好方法? 我对复制问题做了一些丑陋的解决方法,但我正在寻找一个更好的解决方案来解决这两个问题。
有没有人有什么建议?
更新:
我的用例:我有一个小事件系统。 每个事件都有一个.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类所依赖的所有函数和其他类定义。 简而言之,A和B都具有所有定义。 只有对象状态的表示才会被移动。
查看有关REST的任何文章。
http://en.wikipedia.org/wiki/Representational_State_Transfer
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.