腌制一个动态参数化的子类

腌制一个动态参数化的子类,第1张

腌制一个动态参数化的子类

对的,这是可能的 -

每当您要自定义对象的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)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5655336.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存