だから...あなたがこのようなものを構築していたとしましょう...これは、ファクトリメソッド内にクラスのインスタンスを構築します。次に、報告したエラーが発生します。トレースバックを見てください... pickle がしようとしているのはpickle.save_global
、クラスをシリアル化するために使用することです。関数内に構築されていますが、__main__
では、クラスは実際に名前が付けられ__main___.Object
ます...そしてクラスはありません...名前空間__main__.Object
内にネストされています。object_factory
Python では、クラス、インスタンス、関数、およびその他のオブジェクトを動的に構築するためにファクトリ メソッドがよく使用されます。ファクトリ メソッドを使用している場合は、代わりに、関数の代わりに別のクラス内にファクトリ メソッドを作成できます。これにより、ピッカーが Object クラスのインスタンスを現在よりもシリアル化できる可能性が高くなります。 .
>>> def object_factory(a,b):
... c = a+b
... class Object(object):
... d = 1
... e = [c, d, [1,2,3]]
... def foo(self, x):
... return (self.d * c) + (x * Object.e)
... return Object()
...
>>> A = object_factory([4,5],[6,7])
>>> A
<__main__.Object object at 0x973030>
>>> A.d
1
>>> A.e
[[4, 5, 6, 7], 1, [1, 2, 3]]
>>> A.foo(1)
[4, 5, 6, 7, [4, 5, 6, 7], 1, [1, 2, 3]]
>>>
>>> _A = pickle.dumps(A)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 1366, in dumps
Pickler(file, protocol).dump(obj)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 224, in dump
self.save(obj)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 401, in save_reduce
save(args)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 562, in save_tuple
save(element)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 753, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <class '__main__.Object'>: it's not the same object as __main__.Object
コードを投稿するか、少なくとも問題を示すおもちゃのコードを投稿すると役立ちます。