我的代码(我无法使用'pickle'):
class A(object):
def __getstate__(self):
print 'www'
return 'sss'
def __setstate__(self,d):
print 'aaaa'
import pickle
a = A()
s = pickle.dumps(a)
e = pickle.loads(s)
print s,e
打印:
www
aaaa
ccopy_reg
_reconstructor
p0
(c__main__
A
p1
c__builtin__
object
p2
Ntp3
Rp4
S'sss'
p5
b. <__main__.A object at 0x00B08CF0>
谁能告诉我如何使用。
答案 0 :(得分:4)
你想做什么?它对我有用:
class A(object):
def __init__(self):
self.val = 100
def __str__(self):
"""What a looks like if your print it"""
return 'A:'+str(self.val)
import pickle
a = A()
a_pickled = pickle.dumps(a)
a.val = 200
a2 = pickle.loads(a_pickled)
print 'the original a'
print a
print # newline
print 'a2 - a clone of a before we changed the value'
print a2
print
print 'Why are you trying to use __setstate__, not __init__?'
print
所以这将打印出来:
the original a
A:200
a2 - a clone of a before we changed the value
A:100
如果您需要setstate:
class B(object):
def __init__(self):
print 'Perhaps __init__ must not happen twice?'
print
self.val = 100
def __str__(self):
"""What a looks like if your print it"""
return 'B:'+str(self.val)
def __getstate__(self):
return self.val
def __setstate__(self,val):
self.val = val
b = B()
b_pickled = pickle.dumps(b)
b.val = 200
b2 = pickle.loads(b_pickled)
print 'the original b'
print b
print # newline
print 'b2 - b clone of b before we changed the value'
print b2
打印:
Why are you trying to use __setstate__, not __init__?
Perhaps __init__ must not happen twice?
the original b
B:200
b2 - b clone of b before we changed the value
B:100
答案 1 :(得分:3)
您可以pickle
(意思是,此代码可以正常工作)。你似乎得到了一个结果,你没想到。如果您期望相同的“输出”,请尝试:
import pickle
a = A()
s = pickle.dumps(a)
e = pickle.loads(s)
print s, pickle.dumps(e)
你的例子不是一个典型的“酸洗”例子。通常,腌制对象会持久保存在某处或通过电线发送。参见例如pickletest.py
:http://www.sthurlow.com/python/lesson10/。
pickling
有高级用法,例如参见David Mertz XML对象序列化文章:http://www.ibm.com/developerworks/xml/library/x-matters11.html
答案 2 :(得分:0)
简而言之,在您的示例中,e等于a。
不必关心这些strang字符串,你可以转储这些字符串以保存到任何地方,只要记住加载它们时,你再次得到'a'对象。