[英]Python pickling keep object identity
有什么方法可以保留腌制對象的身份,即具有以下打印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
重要說明是,您必須使用協議版本2(假設更高版本)。 因為否則,永遠不會調用__new__
。 這僅是關於pickle.dumps
, loads
無關緊要。
import pickle
class Foo:
_id_counter = 0
def __init__(self):
self._id = Foo._id_counter
Foo._id_counter += 1
x = Foo()
print(x._id==pickle.loads(pickle.dumps(x))._id) # True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.