Python 如何将变量从pickle集成回对象

Python 如何将变量从pickle集成回对象,python,pickle,Python,Pickle,我已经上了我的课,那是自救 我希望该类能够将数据从pickle导入回…: 比如: myFirstInstance.printV1() #variable is set to 4 by the __init__ myFirstInstance.write2Pickle(myPickleFile.pkl) mySecondInstance.loadPickleData(myPickleFile.pkl) mySecondInstance.printV1() # should give 4 back

我已经上了我的课,那是自救

我希望该类能够将数据从pickle导入回…:

比如:

myFirstInstance.printV1() #variable is set to 4 by the __init__
myFirstInstance.write2Pickle(myPickleFile.pkl)

mySecondInstance.loadPickleData(myPickleFile.pkl)
mySecondInstance.printV1() # should give 4 back from the firstInstance...

使用
pickle
非常简单:

import cPickle as pickle
with open('a.pkl', 'wb') as f:
    pickle.dump(obj, f)
with open('a.pkl', 'rb') as f:
    obj = pickle.load(f)

如果您的类需要特殊的逻辑来进行酸洗/取消酸洗,则应重写所使用的方法(例如
\uuuu getstate\uuuu
/
\uu setstate\uuu
)。这样,上面的用法仍然有效。

这有点棘手,因为您正在从现有实例中更改类实例的状态……而且您还希望从类实例中pickle类实例。为了简化类实例的pickle,我使用
dill
而不是
pickle

>>> import dill
>>> 
>>> class MyClass(object):
...   def __init__(self, x):
...     self.V1 = x
...   def printV1(self):
...     print(self.V1)
...   def write2Pickle(self, filename):
...     with open(filename, 'wb') as f:
...       dill.dump(self, f)
...   def loadPickleData(self, filename):
...     with open(filename, 'rb') as f:
...       obj = dill.load(f)
...     self.V1 = obj.V1
...     # similarly for other instance state variables
... 
>>> myFirstInstance = MyClass(4)
>>> myFirstInstance.printV1()
4
>>> myFirstInstance.write2Pickle('myPickleFile.pkl')
>>> del myFirstInstance
>>> mySecondInstance = MyClass(1)
>>> mySecondInstance.printV1()
1
>>> mySecondInstance.loadPickleData('myPickleFile.pkl')
>>> mySecondInstance.printV1()
4
我要指出的是,最好的编程实践是不要将pickle和unpicking作为类方法……除非有很好的理由说明它应该存在

此外,您还可以直接取消勾选并获得一个非常好的新实例,因此,除非您需要覆盖现有实例的状态,否则无需将取消勾选作为类方法

>>> with open('myPickleFile.pkl', 'rb') as f:
...   myThirdInstance = dill.load(f)
... 
>>> myThirdInstance.printV1()
4

类似地,您可以在实例外部使用
dump
,它还可以创建一个新的pickle实例。

。。。取消勾选数据有什么问题?取消勾选不会覆盖现有对象,它会使用已被勾选的相同数据创建新对象。如果OP已定义,则说明您建议如何使用
\uuu getstate\uuuuuuuuuuuuu>/
\uuuuuuu setstte\uuuuuuuuuu