gpt4 book ai didi

python - Unpickle 有时会生成空白对象

转载 作者:太空宇宙 更新时间:2023-11-04 07:22:23 31 4
gpt4 key购买 nike

我正在尝试使用 pickle 来保存自定义类;非常类似于下面的代码(尽管在类上定义了一些方法,还有一些用于数据的指令等)。然而,当我运行这个程序时,pickle 然后 unpickle,我丢失了类中的所有数据,就好像我创建了一个新的空白实例。

import pickle
class MyClass:
VERSION = 1
some_data = {}
more_data = set()

def save(self,filename):
with open(filename, 'wb') as f:
p = pickle.Pickler(f)
p.dump(self)

def load(filename):
with open(filename,'rb') as ifile:
u = pickle.Unpickler(ifile)
obj = u.load()
return obj

我想知道这是否与 pickle 课的备忘录有关,但我觉得不应该。当它不起作用时,我查看我生成的文件,它看起来像这样:(显然不是可读的,但它显然不包含任何数据)

€c__main__MyClassq

无论如何,我希望这足以让人们了解这里可能发生的事情,或者要看什么。

最佳答案

您遇到的问题是您使用可变类变量来保存数据,而不是将数据放入实例变量中。

pickle 模块只保存直接存储在实例上的数据,不保存也可以通过self 访问的类变量。当您发现 unpickled 实例没有数据时,这可能意味着该类不保存上一次运行的数据,因此实例无法再访问它。

以这种方式使用类变量可能还会给您带来其他问题,因为数据将由该类的所有实例共享!下面是说明问题的 Python 控制台 session 代码:

>>> class Foo(object):
class_var = []
def __init__(self, value):
self.class_var.append(value)

>>> f1 = Foo(1)
>>> f1.class_var
[1]
>>> f2 = Foo(2)
>>> f2.class_var
[1, 2]

这可能不是您想要的。但情况变得更糟了!

>>> f1.class_var
[1, 2]

您认为属于 f1 的数据已被 f2 的创建更改。事实上,f1.class_varf2.class_var 是完全相同的对象(它也可以直接通过 Foo.class_var 获得,无需经过任何实例)。

因此,使用类变量几乎肯定不是您想要的。相反,为创建新值并将其保存为实例变量的类编写一个 __init__ 方法:

>>> class Bar(object):
def __init__(self, value):
self.instance_var = [] # creates a separate list for each instance!
self.instance_var.append(value)

>>> b1 = Bar(1)
>>> b1.instance_var
[1]
>>> b2 = Bar(2)
>>> b2.instance_var # doesn't include value from b1
[2]
>>> b1.instance_var # b1's data is unchanged
[1]

Pickle 将按照您的预期处理此类。它的所有数据都在实例中,所以当你解开时你不应该以一个空实例结束。

关于python - Unpickle 有时会生成空白对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678412/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com