Python:保存和加载类定义

1 投票
1 回答
3389 浏览
提问于 2025-04-16 09:16

我对使用pickle模块来保存和加载对象很感兴趣,正如我之前问过的一个问题中提到的:Python:使用pickle模块保存和加载对象时的错误

有人评论说:

1. 另外一种说法是:这个错误发生是因为pickle想要加载一个Fruits类的实例,但它在寻找这个类的定义时没有找到,所以就报错了。

现在我想保存和加载一个类的定义,以解决我在之前提到的问题。非常感谢!

1 个回答

10

pickle模块可以保存和加载对象的内部状态。这里的“内部状态”指的是对象的数据,而代码本身并不算在内部状态里,甚至对于类来说也是如此,这就让事情变得复杂了。

一种明显的方法是把整个类的定义放在一个字符串里,然后把这个字符串进行pickle处理,接着再加载它,最后用exec()来执行这个字符串。还有一种可能有效也可能无效的选择是使用一个元类,这个元类可以处理代码的pickle和unpickle,但这要复杂得多,而且效果也不见得更好。

不过,这种做法有很多原因是非常糟糕的主意,我敢打赌你没有好的理由去这么做。你99.9%的可能性是在走错路。你现在遇到的问题是因为你选择了错误的解决方案,而你却在试图解决这个方案带来的问题,而不是选择一个更好的解决方案,这个更好的方案可能会简单得多。

所以,你需要不仅仅解释你当前遇到的问题,还要说明你想要解决的更大范围的使用场景。这样我们才能告诉你如何用更好的方式来解决这个使用场景。

撰写回答