gpt4 book ai didi

python - 向 Python 类添加属性时如何更新 pickle 对象

转载 作者:行者123 更新时间:2023-12-05 05:12:39 30 4
gpt4 key购买 nike

我定义了一个 Python3 类,然后使用 pickle 序列化实例并将其保存到文件中。后来我向我的类添加了另一个实例属性,但我意识到如果我加载我的实例并尝试引用该属性,我将得到一个“对象没有属性”错误,因为实例是在没有它的情况下构造的。将新属性添加到我的 pickle 对象并进行配置的最佳选择是什么?

在代码中,我定义了一个类

# First definition
class Foo:
def __init__(self, params):
# define and initialize attributes
def print_number(self):
print(2)

我使用 pickle 创建并序列化一个实例,并将其保存到文件

import pickle

inst = Foo(params)
with open("filename", 'wb') as f:
pickle.dump(inst, f)

然后我希望我的类表现得有点不同,所以我更新了它的定义:

# 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 而不是 2 .然而,引用 inst.bar 导致“对象没有属性”错误,因为 instFoo 的定义中具有该属性之前被初始化。

更新

这对我来说是一个有点菜鸟的问题,我没有意识到 Python 可以让你做类似 inst.bar = "baz" 的事情并动态设置(我是来自 Java 背景,其中所有内容都必须从一开始就修复)。我仍然有兴趣了解如何正确执行此操作和/或 Pythonicaly 和/或 pickle-specific,尤其是当可以预期多个类更新时。

最佳答案

你可以使用 class inheritance向现有类添加新方法/属性:

# First definition
class Foo:
def __init__(self, params):
self.params = params
def print_number(self):
print(2)

import pickle

inst = Foo('params')
with open("filename", 'wb') as f:
pickle.dump(inst, f)

del inst

# Updated definition
class Foo(Foo):
def __init__(self, params):
super().__init__(params)
self.bar = "baz" # bar is a new attribute
def print_number(self):
print(3)


with open("filename", 'rb') as f:
inst = Foo(pickle.load(f))

inst.print_number()
print(inst.bar)

# Outputs:
# 3
# baz

或者在实践中做这样的事情可能更有意义:

with open("filename", 'rb') as f:
inst = pickle.load(f)

# Updated definition
class Foo(inst.__class__):
def __init__(self, params):
super().__init__(params)
self.bar = "baz" # bar is a new attribute
def print_number(self):
print(3)



inst = Foo(inst)
inst.print_number()
print(inst.bar)

关于python - 向 Python 类添加属性时如何更新 pickle 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54384050/

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