我打算在当前阶段保存所有类变量,然后加载它们以复制相同的工作。我试图挑选类的所有对象实例,但我猜我自己在目标对象中创建了另一个子对象,它不能发泡。我的另一个解决方案是挑选物品" self"重新加载所有类变量供以后使用。通过泡菜是否可行或你的建议是什么?
例如我有
class A:
...
class B:
...
def __init__():
self.A_ins = A
self.var1 = ...
self.var2 = ...
b = B()
f = open(file_name,'wb')
pickle.dump(b,f)
这是我得到的错误,如果我尝试直接腌制
TypeError: can't pickle instancemethod objects
在这个例子中,我尝试保存B类对象并在以后重新加载。如果由于子对象A_ins不可能,我建议挑选B类对象的self并重新加载它。
答案 0 :(得分:0)
看起来好像你将self.A_ins
设置为A类,而不是A类的实例。这可能是您的问题 - 您正试图挑选{{1 A的方法。
尝试将__init__()
更改为self.A_ins = A
。
答案 1 :(得分:0)
你不能用pickle
来腌制,但是如果你使用dill
,这应该不是问题。 dill
应该能够挑选B
,无论是A
的实例还是类对象A
(如上所述)。
Python 3.3.5 (default, Mar 10 2014, 21:37:38)
[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.
>>> class A:
... pass
...
>>> class B:
... def __init__(self):
... self.A_ins = A
... self.var1 = 1
... self.var2 = 2
...
>>> b = B()
>>>
>>> import dill
>>> dill.dumps(b)
b'\x80\x03cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01X\x04\x00\x00\x00typeq\x02\x85q\x03Rq\x04X\x01\x00\x00\x00Bq\x05h\x01X\x06\x00\x00\x00objectq\x06\x85q\x07Rq\x08\x85q\t}q\n(X\r\x00\x00\x00__slotnames__q\x0b]q\x0cX\n\x00\x00\x00__module__q\rX\x08\x00\x00\x00__main__q\x0eX\x08\x00\x00\x00__init__q\x0fcdill.dill\n_create_function\nq\x10(cdill.dill\n_unmarshal\nq\x11C\xb0c\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\x1f\x00\x00\x00t\x00\x00|\x00\x00_\x01\x00d\x01\x00|\x00\x00_\x02\x00d\x02\x00|\x00\x00_\x03\x00d\x00\x00S(\x03\x00\x00\x00Ni\x01\x00\x00\x00i\x02\x00\x00\x00(\x04\x00\x00\x00u\x01\x00\x00\x00Au\x05\x00\x00\x00A_insu\x04\x00\x00\x00var1u\x04\x00\x00\x00var2(\x01\x00\x00\x00u\x04\x00\x00\x00self(\x00\x00\x00\x00(\x00\x00\x00\x00u\x07\x00\x00\x00<stdin>u\x08\x00\x00\x00__init__\x02\x00\x00\x00s\x06\x00\x00\x00\x00\x01\t\x01\t\x01q\x12\x85q\x13Rq\x14c__builtin__\n__main__\nh\x0fNN}q\x15tq\x16Rq\x17X\x07\x00\x00\x00__doc__q\x18Nutq\x19Rq\x1a)\x81q\x1b}q\x1c(X\x05\x00\x00\x00A_insq\x1dh\x00(h\x04X\x01\x00\x00\x00Aq\x1eh\x08\x85q\x1f}q (h\x18Nh\rh\x0eutq!Rq"X\x04\x00\x00\x00var2q#K\x02X\x04\x00\x00\x00var1q$K\x01ub.'
>>>
>>> _b = dill.loads(dill.dumps(b))
>>> _b.A_ins
<class '__main__.A'>
>>>
答案 2 :(得分:0)
如果您使用的是Python2
,则您拥有classic classes
,这些邮件无法销售。尝试从对象继承,即将class A:
替换为class A(object):
。
如果你在Python3
,我猜你有不同的问题,因为newstyle是默认的。 https://docs.python.org/2/reference/datamodel.html#newstyle
不要假设OP使用Python2