Pickle两个类变量和实例变量?

时间:2014-10-16 17:01:09

标签: python pickle

pickle documentation表示"当类实例被腌制时,它们的类的数据不会与它们一起被腌制。只腌制实例数据。"任何人都可以提供一个包含类变量的配方以及在酸洗和去除颜色时包含实例变量吗?

3 个答案:

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