我定义了一个Python3类,然后使用pickle序列化一个实例并将其保存到文件中。后来我在类中添加了另一个实例属性,但是我意识到如果我加载实例并尝试引用该属性,我将得到一个“objecthasnotattribute”错误,因为实例是在没有它的情况下构建的。向pickled对象添加新属性并对其进行配置的最佳选项是什么?在
在代码中,我定义了一个类# First definition
class Foo:
def __init__(self, params):
# define and initialize attributes
def print_number(self):
print(2)
我使用pickle创建并序列化一个实例,并将其保存到文件中
^{pr2}$
然后我希望我的类有点不同,所以我更新了它的定义:# Updated definition
class Foo:
def __init__(self, params):
# define and initialize attributes
self.bar = "baz" # bar is a new attribute
def print_number(self):
print(3) # prints 3 instead of 2
然后加载实例并尝试调用一些方法import pickle
with open("filename", 'rb') as f:
inst = pickle.load(f)
inst.print_number()
print(inst.bar)
由于pickle不保存方法定义,所以实例方法的行为被更新,因此inst.print_number()打印3,而不是{}。但是,引用inst.bar会导致“Object has no attribute”错误,因为inst是在{}的定义中具有该属性之前初始化的。在
更新
对于我来说,这是一个很难回答的问题,我没有意识到Python允许你做一些类似inst.bar = "baz"的事情并动态地设置(我来自一个Java背景,在那里所有的事情都必须从一开始就被修复)。我仍然对如何正确地执行此操作和/或Pythonicaly和/或pickle特别感兴趣,特别是在可能需要多个类更新的情况下。在