取消拾取对象时发生AttributeError

发布于 2021-01-29 17:23:44

我试图在一个模块中腌制一个类的实例,然后在另一个模块中腌制它。

这是我泡菜的地方:

import cPickle

def pickleObject():
    object = Foo()
    savefile = open('path/to/file', 'w')
    cPickle.dump(object, savefile, cPickle.HIGHEST_PROTOCOL)


class Foo(object):
    (...)

这是我尝试解开的地方:

savefile = open('path/to/file', 'r')
object = cPickle.load(savefile)

在第二行,我得到 AttributeError: 'module' object has no attribute 'Foo'

有人看到我在做什么错吗?

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    class Foo 必须在解酸环境中通过相同的路径导入,以便可以重新实例化酸洗的对象。

    我认为您的问题是您Foo在要作为main(__name__ == "__main__")执行的模块中定义。Pickle会将路径(而不是类object
    / definition !!!)序列化为Foo位于主模块中。 Foo不是主要打开脚本的属性。

    在此示例中,您可以重新定义class Foo解腌脚本,并且它应该也可以解腌。但实际上是要有一个在两个脚本之间共享的公共库,并且可以通过同一路径使用。示例:Foo在foo.py中定义

    简单的例子:

    $ PROJECT_DIR / foo.py

    class Foo(object):
        pass
    

    $ PROJECT_DIR / picklefoo.py

    import cPickle
    from foo import Foo
    
    def pickleObject():
        obj = Foo()
        savefile = open('pickle.txt', 'w')
        cPickle.dump(obj, savefile, cPickle.HIGHEST_PROTOCOL)
    
    
    pickleObject()
    

    $ PROJECT_DIR / unpicklefoo.py

    import cPickle
    
    savefile = open('pickle.txt', 'r')
    obj = cPickle.load(savefile)
    ...
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看