有什么方法可以保留腌制对象的身份,即具有以下打印内容True
:
import pickle
class Foo:
pass
x = Foo()
print(x is pickle.loads(pickle.dumps(x))) #False
我在 Linux 机器上使用 cPickle 和 cpython 3.x,不需要便携式的东西。
对的,这是可能的;您需要以某种方式在腌制结果中包含“身份”;最自然的使用方式__getnewargs__
并有一个__new__
在这种情况下,方法返回现有的缓存实例。
import uuid
import weakref
class Foo(object):
ident_cache = weakref.WeakValueDictionary()
def __new__(cls, identity=None, **kwargs):
if identity is None:
identity = uuid.uuid1()
try:
self = cls.ident_cache[identity]
except KeyError:
self = super(Foo, cls).__new__(cls)
self.__identity = identity
self.__init__(**kwargs)
cls.ident_cache[identity] = self
return self
def __getnewargs__(self):
return (self.__identity,)
def __init__(self, foo):
self.foo = foo
>>> import pickle
>>> a = Foo(foo=1)
>>> b = pickle.loads(pickle.dumps(a, pickle.HIGHEST_PROTOCOL))
>>> a is b
True
重要的一点是你must使用协议版本 2(或假设更高版本);因为否则,__new__
从未被调用过。这只是一个关心的问题pickle.dumps
, loads
不在乎。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)