pickle documentation表示"当类实例被腌制时,它们的类的数据不会与它们一起被腌制。只腌制实例数据。"任何人都可以提供一个包含类变量的配方以及在酸洗和去除颜色时包含实例变量吗?
答案 0 :(得分:5)
使用dill
代替pickle,并准确编码您可能已经完成的工作。
>>> class A(object):
... y = 1
... x = 0
... def __call__(self, x):
... self.x = x
... return self.x + self.y
...
>>> b = A()
>>> b.y = 4
>>> b(2)
6
>>> b.z = 5
>>> import dill
>>> _b = dill.dumps(b)
>>> b_ = dill.loads(_b)
>>>
>>> b_.z
5
>>> b_.x
2
>>> b_.y
4
>>>
>>> A.y = 100
>>> c = A()
>>> _c = dill.dumps(c)
>>> c_ = dill.loads(_c)
>>> c_.y
100
答案 1 :(得分:0)
通过使用__getstate__
和__setstate__
,可以使用标准库函数轻松完成此操作:
class A(object):
y = 1
x = 0
def __getstate__(self):
ret = self.__dict__.copy()
ret['cls_x'] = A.x
ret['cls_y'] = A.y
return ret
def __setstate__(self, state):
A.x = state.pop('cls_x')
A.y = state.pop('cls_y')
self.__dict__.update(state)
答案 2 :(得分:0)
这是仅使用标准库模块的解决方案。只需执行以下代码块,此后,pickle就会以所需的方式运行。正如Mike McKerns所说,dill
在幕后做了类似的事情。
根据相关讨论发现here。
import copy_reg
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)