我可以腌制"self" python 类吗?



我打算在当前阶段保存我所有的类变量,稍后加载它们以复制相同的工作。我试图腌制类的所有对象实例,但我想因为我在目标对象中创建了另一个子对象,它无法腌制。我的另一个解决方案是将对象"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

最新更新