取消拾取对象时的属性错误

2024-06-16 08:42:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个模块中选取一个类的实例,然后在另一个模块中取消对它的选取。

我在这里泡菜:

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'

有人知道我做错了什么吗?


Tags: 模块topath实例importobjectfoodef
2条回答

杰里米·布朗(Jeremy Brown)的回答是对的,这里有一个更具体的说法:

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

以及:

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

使Foo在每段代码中都位于同一名称空间中。

class Foo必须通过unpickling环境中的同一路径导入,以便可以重新实例化pickled对象。

我认为您的问题是您在作为main执行的模块(__name__ == "__main__")中定义了Foo。Pickle将序列化路径(不是类对象/定义!!!)作为主模块中的FooFoo不是主unpickle脚本的属性。

在这个例子中,您可以在unpickling脚本中重新定义class Foo,它应该可以很好地解除pickle。但其目的实际上是在两个脚本之间共享一个公共库,这两个脚本将通过相同的路径可用。示例:在foo.py中定义Foo

简单示例:

$项目目录/foo.py

class Foo(object):
    pass

$PROJECT目录/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目录/unpicklefoo.py

import cPickle

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

相关问题 更多 >