
对的,这是可能的 -
每当您要自定义对象的Pickle和Unpickle行为时,只需在类本身上设置“
__getstate__”和“
__setstate__”方法即可。
在这种情况下,这有点棘手:如您所见,需要在全局名称空间中存在一个类,该类是当前正在被腌制的对象的类:它必须是具有相同名称的相同类。好的-
要做的是可以在Pickle时创建存在于globalname空间中的gthis类。
在Unpickle时间,必须存在具有相同名称的类-但不必是同一对象-
就像它一样-并
__setstate__在Unpickling过程中被称为,它可以重新创建原始的参数化类对象,并通过设置
__class__对象的属性将其自己的类设置为该类。
设置
__class__对象的属性可能令人反感,但这是OO在Python中的工作方式,并且已正式记录,甚至可以在各种实现中使用。(我在Python
2.6和Pypy中都测试了此代码段)
class base(object): def m(self): return self.__class__.PARAM def __getstate__(self): global AutoSub AutoSub = self.__class__ return (self.__dict__,self.__class__.PARAM) def __setstate__(self, state): self.__class__ = make_parameterized(state[1]) self.__dict__.update(state[0])def make_parameterized(param_value): class AutoSub(base): PARAM = param_value return AutoSubclass AutoSub(base): passif __name__ == "__main__": from pickle import dumps, loads a = make_parameterized("a")() b = make_parameterized("b")() print a.PARAM, b.PARAM, type(a) is type(b) a_p = dumps(a) b_p = dumps(b) del a, b a = loads(a_p) b = loads(b_p) print a.PARAM, b.PARAM, type(a) is type(b)欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)