我可以腌制python类的“自我”吗?

时间:2014-12-14 13:12:12

标签: python serialization pickle

我打算在当前阶段保存所有类变量,然后加载它们以复制相同的工作。我试图挑选类的所有对象实例,但我猜我自己在目标对象中创建了另一个子对象,它不能发泡。我的另一个解决方案是挑选物品" 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并重新加载它。

3 个答案:

答案 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