当前位置:  开发笔记 > 编程语言 > 正文

如何恢复一个腌制的类及其实例

如何解决《如何恢复一个腌制的类及其实例》经验,为你挑选了1个好方法。

我想存储一个类和许多实例供以后使用,或提供给其他人。

到目前为止,我可以腌制和恢复实例,但是在加载它们之前,我必须手动重新创建该类。

我查看了这份文档,这使我相信我应该能够以某种方式执行此操作,但是我似乎无法确切地找到执行该操作的方法。

编辑:我读过这个答案讨论使用的dill(见这问题的答案也),但我没有dill安装。我想要一个泡菜解决方案(如果存在)。

import numpy as np
import pickle

class wow(object):
    def __init__(self, x):
        self.x = x

w5 = wow(np.arange(5))
w3 = wow(range(3))

with open("w5w3.pickle", "w") as outfile:
    pickle.dump([w5, w3], outfile)

# save the class also
with open("wow.pickle", "w") as outfile:
    pickle.dump(wow, outfile)

# OK, now delete class wow, then try to recover the pickles
del wow, w3, w5

try:
    with open("wow.pickle", "r") as infile:
        wow = pickle.load(infile)

except Exception, e:  # returns: "'module' object has no attribute 'wow'"
    print str(e)
    print "so manually recreate class wow"

    class wow(object):
        def __init__(self, x):
            self.x = x  

with open("w5w3.pickle", "r") as infile:
    W = pickle.load(infile)

for thing in W:
    print type(thing.x), thing.x

justhalf.. 5

我相信是由于删除了类定义而导致的错误。Python中的对象序列化(据我所知也是Java)要求存在类定义。

从链接的文档中:

请注意,函数(内置的和用户定义的)是通过“完全限定”的名称引用而不是值进行酸洗的。这意味着仅对函数名称以及定义该函数的模块的名称进行了酸洗。既不对函数的代码也不对其任何函数属性进行酸洗。因此,定义模块必须在拆开环境中是可导入的,并且该模块必须包含命名对象,否则将引发异常。[4]

同样,通过命名引用对类进行酸洗,因此在未酸洗环境中也适用相同的限制。请注意,该类的代码或数据都不会被腌制

如果要向朋友发送类和实例,请通过定义class的代码发送类wow,并通过pickle文件发送实例。



1> justhalf..:

我相信是由于删除了类定义而导致的错误。Python中的对象序列化(据我所知也是Java)要求存在类定义。

从链接的文档中:

请注意,函数(内置的和用户定义的)是通过“完全限定”的名称引用而不是值进行酸洗的。这意味着仅对函数名称以及定义该函数的模块的名称进行了酸洗。既不对函数的代码也不对其任何函数属性进行酸洗。因此,定义模块必须在拆开环境中是可导入的,并且该模块必须包含命名对象,否则将引发异常。[4]

同样,通过命名引用对类进行酸洗,因此在未酸洗环境中也适用相同的限制。请注意,该类的代码或数据都不会被腌制

如果要向朋友发送类和实例,请通过定义class的代码发送类wow,并通过pickle文件发送实例。

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有