擅长:python、mysql、java
<p>如果这个功能如此重要的话,那么它现在就在语言核心中了。:-)
所以,不,在任何高级形式下使用Python都不是很重要——如果您有一个依赖于能够重新实例化基于旧模型的对象的项目——这是可能的,那么您必须仔细考虑它,并且可能将旧模型保留在显式代码中,而不是序列化。</p>
<p>我的建议是“把它分开”,直到你认为你真的需要它,并将它与其他解决方案进行了比较,比如一个强大的模型迁移策略。</p>
<p>也就是说,我试过dill,它的工作原理和广告一样:它可以序列化一个类
就像pickle可以使用“dump”和“dumps”调用处理普通对象一样,用“load”和“loads”重新构建类对象。</p>
<p>可能让您感到困惑的是,序列化对象(通过pickle或dill等)既不包括其源代码(即用于定义类的文本Python代码的实际行数),也不包括其名称。</p>
<p>因此,如果一个类被命名为“a”,那么当它被序列化时,如果在“取消填充”之后需要这个名称,那么必须在全局名称空间中重新将这个名称分配给它。它的原始名称保留在它的<code>__name__</code>属性中。(对于同一个模型的多个版本一起生活,这会导致很多冲突)。</p>
<p>因此:</p>
<pre><code>class A(object):
...
import dill
dill.dump(A, open("myfile", "w"))
del A
....
someclass = dill.load(open("myfile"))
print (someclass.__name__)
globals()[someclass.__name__] = someclass
# at this point you have the "A" class back in the global namespace
</code></pre>