<p>我想您正在寻找以下功能之一</p>
<p>在这里,我构建一个类和一个实例,然后更改类定义。
pickled类和实例仍然是不可picklable的,因为<code>dill</code>pickles
默认情况下类的源代码…并管理有几个类
在命名空间中使用相同的名称(它只是通过管理指针
对类定义的引用)。</p>
<pre><code>Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>>
>>> class Foo(object):
... def bar(self, x):
... return x+self.y
... y = 1
...
>>> f = Foo()
>>> _Foo = dill.dumps(Foo)
>>> _f = dill.dumps(f)
>>>
>>> class Foo(object):
... def bar(self, x):
... return x*self.z
... z = -1
...
>>> f_ = dill.loads(_f, ignore=True)
>>> f_.y
1
>>> f_.bar(1)
2
>>> Foo_ = dill.loads(_Foo)
>>> g = Foo_()
>>> g.bar(1)
2
</code></pre>
<p>泡菜会在上面爆炸。如果您不希望<code>dill</code>显式序列化类,并且不希望<code>pickle</code>做什么,那么您可以要求<code>dill</code>通过引用<code>dill.dumps(Foo, byref=True)</code>来pickle。或者,可以使用<code>ignore=False</code>(默认值)动态决定忽略新定义的类。</p>
<p>现在,在下面的例子中,我们使用新的类定义,并提取源
从对象中,然后将其保存到文件中。另外,我们可以将源文件转储到一个文件中(这里我使用一个临时文件),以便以后可以导入它。</p>
<pre><code>>>> sFoo = dill.source.getsource(Foo)
>>> print sFoo
class Foo(object):
def bar(self, x):
return x*self.z
z = -1
>>> open('myFoo.py', 'w').write(sFoo)
>>>
>>> f = dill.temp.dump_source(Foo, dir='.')
>>> f.name
'/Users/mmckerns/dev/tmpM1dzYN.py'
>>> from tmpM1dzYN import Foo as _Foo_
>>> h = _Foo_()
>>> h.bar(2)
-2
>>> from myFoo import Foo as _SFoo_
>>> _SFoo_.z
>>> -1
>>>
</code></pre>
<p>我希望这会有帮助。</p>