我打算在当前阶段保存我所有的类变量,稍后加载它们以复制相同的工作。我试图腌制类的所有对象实例,但我想因为我在目标对象中创建了另一个子对象,它无法腌制。我的另一个解决方案是将对象"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 picking 自制并重新加载它。
看起来您正在将self.A_ins
设置为类 A,而不是类 A 的实例。这可能是你的问题 - 你正在尝试腌制A的__init__()
方法。
尝试将self.A_ins = A
更改为 self.A_ins = A()
。
用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'x80x03cdill.dilln_create_typenqx00(cdill.dilln_load_typenqx01Xx04x00x00x00typeqx02x85qx03Rqx04Xx01x00x00x00Bqx05hx01Xx06x00x00x00objectqx06x85qx07Rqx08x85qt}qn(Xrx00x00x00__slotnames__qx0b]qx0cXnx00x00x00__module__qrXx08x00x00x00__main__qx0eXx08x00x00x00__init__qx0fcdill.dilln_create_functionnqx10(cdill.dilln_unmarshalnqx11Cxb0cx01x00x00x00x00x00x00x00x01x00x00x00x02x00x00x00Cx00x00x00sx1fx00x00x00tx00x00|x00x00_x01x00dx01x00|x00x00_x02x00dx02x00|x00x00_x03x00dx00x00S(x03x00x00x00Nix01x00x00x00ix02x00x00x00(x04x00x00x00ux01x00x00x00Aux05x00x00x00A_insux04x00x00x00var1ux04x00x00x00var2(x01x00x00x00ux04x00x00x00self(x00x00x00x00(x00x00x00x00ux07x00x00x00<stdin>ux08x00x00x00__init__x02x00x00x00sx06x00x00x00x00x01tx01tx01qx12x85qx13Rqx14c__builtin__n__main__nhx0fNN}qx15tqx16Rqx17Xx07x00x00x00__doc__qx18Nutqx19Rqx1a)x81qx1b}qx1c(Xx05x00x00x00A_insqx1dhx00(hx04Xx01x00x00x00Aqx1ehx08x85qx1f}q (hx18Nhrhx0eutq!Rq"Xx04x00x00x00var2q#Kx02Xx04x00x00x00var1q$Kx01ub.'
>>>
>>> _b = dill.loads(dill.dumps(b))
>>> _b.A_ins
<class '__main__.A'>
>>>
在Python2
上,你有classic classes
,这是不可挑剔的。尝试从对象继承,即将class A:
替换为class A(object):
。
如果你在Python3
我想你有一个不同的问题,因为newstyle是默认的。 https://docs.python.org/2/reference/datamodel.html#newstyle
编辑:
不要假设 OP 使用Python2