Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Pickle不序列化我的类数组?_Python_Python 3.x_Pickle - Fatal编程技术网

Python 为什么Pickle不序列化我的类数组?

Python 为什么Pickle不序列化我的类数组?,python,python-3.x,pickle,Python,Python 3.x,Pickle,我正在尝试使用python的pickle将大量自定义类序列化到磁盘。但是,这些类没有正确序列化 看了这本书后,我的理解是我正在努力做的事情应该起作用,但也许这不仅仅是因为我不理解某些事情 我的类是在模块的顶层定义的。并且在尝试pickle时没有激发PicklingError异常 这是我的示例代码。取消对Save()的注释以进行序列化;取消要加载的Load()注释。加载时,不会填充Term的同义词数组,但会反序列化Term的主要对象。通过检查Load()函数返回的“loadedTerms”对象可以

我正在尝试使用python的pickle将大量自定义类序列化到磁盘。但是,这些类没有正确序列化

看了这本书后,我的理解是我正在努力做的事情应该起作用,但也许这不仅仅是因为我不理解某些事情

我的类是在模块的顶层定义的。并且在尝试pickle时没有激发PicklingError异常

这是我的示例代码。取消对Save()的注释以进行序列化;取消要加载的Load()注释。加载时,不会填充Term的同义词数组,但会反序列化Term的主要对象。通过检查Load()函数返回的“loadedTerms”对象可以看到这一点

我做错了什么?谢谢

import pickle

class Entry:
    Text = ""

    def __init__(self, text):
       self.Text = text

class Term:

    Main = None
    Synonyms = []


def Save():
    term = Term()
    term.Main = Entry("Dog")
    term.Synonyms.append(Entry("Canine"))
    term.Synonyms.append(Entry("Pursue"))
    term.Synonyms.append(Entry("Follow"))
    term.Synonyms.append(Entry("Plague"))

    terms = []
    terms.append(term)

    with open('output.pickle', 'wb') as p:
        pickle.dump(terms, p)

def Load():
    loadedTerms = []

    with open('output.pickle', 'rb') as p:
        loadedTerms = pickle.load(p)

    return loadedTerms


#Save()
#terms = Load()

Pickle只保存类的实例属性,但同义词是在类级别定义的列表。您应该在
\uuuu init\uuuu
-方法中创建列表:

import pickle

class Entry:
    def __init__(self, text):
       self.Text = text

class Term:
    def __init__(self):
        self.Main = None
        self.Synonyms = []

def Save():
    term = Term()
    term.Main = Entry("Dog")
    term.Synonyms.append(Entry("Canine"))
    term.Synonyms.append(Entry("Pursue"))
    term.Synonyms.append(Entry("Follow"))
    term.Synonyms.append(Entry("Plague"))

    terms = []
    terms.append(term)

    with open('output.pickle', 'wb') as p:
        pickle.dump(terms, p)

def Load():
    with open('output.pickle', 'rb') as p:
        loadedTerms = pickle.load(p)
    return loadedTerms

类按名称进行pickle。酸洗类不会保存其状态,取消酸洗也不会在酸洗时尝试生成该类的新副本或还原该类的状态。非常确定,您的类定义也没有执行您认为它们正在执行的操作。但据我所知,您的
同义词
属性正在被填充,我仍然感到困惑。我很抱歉说得太多。那么,腌制一个物体有什么好处呢?为什么它要酸洗“Main”对象(我可以很好地反序列化它),而不是数组“同义词”的元素。文档说,“请注意,类的代码或数据都没有经过pickle处理,因此在下面的示例中,类属性attr不会在取消pickle的环境中恢复:”但随后它会转过来说,类似地,当类实例被pickle时,它们的类的代码和数据不会随它们一起被pickle。只有实例数据被pickle。“@juanpa.arrivillaga你能解释一下吗?我很想学习,是的。虽然这不是python术语,但是是的。您在
文本中实际执行的操作。这里:
self.Text=Text
使用实例变量
Text
对静态变量
Text
进行阴影处理。所以你有一个无用的静态变量…非常感谢你的回答,这是有意义的。最后一个问题:您说“同义词”是一个列表,在类级别定义。但是,在我的示例中,Main不是也在类级别定义的吗?在
Save
的第二行中,您将
Main
重新定义为实例属性。啊哈!所以我使用同义词——它是在类级别声明的——因为我通过.append()调用显式引用它……但是我通过将Main设置为某个值来重新定义它。可以正如你所看到的,我对python还是很熟悉的。我的背景是C语言世界。感谢您花时间以这样一种信息丰富的方式回答我的问题。因此,当您创建一个实例变量
Name
时,您可以在实例名称空间上隐藏“static”main。现在静态
Main
无法从实例中访问,因为它将始终使用其实例变量
Main
。非常感谢!